Workerman 启动无响应是因默认监听127.0.0.1:2345裸TCP端口且无HTTP解析能力;需改用WebServer类、监听http://0.0.0.0:8080、设置文档根目录并调用Worker::runAll()。

Workerman 启动后没反应,php start.php start 没报错但访问不了?
Workerman 默认不监听 80 或 443 端口,也不自动绑定 0.0.0.0;它默认只监听 127.0.0.1:2345,且不带 HTTP 协议解析能力——你直接浏览器访问 http://127.0.0.1:2345 是打不开的,因为那是个裸 TCP 连接。
- 确认是否用了
WebServer类(支持 HTTP)而不是基础Worker类 - 检查代码里
$worker->listen的地址:写成tcp://0.0.0.0:2345才能被本机其他程序(如 curl)访问到 - Linux/macOS 下注意权限:非 root 用户无法监听 1024 以下端口,别硬试
80 - 启动时加
-d参数看日志:php start.php start -d,否则前台不输出任何信息就退出了
用 WebServer 写一个能被 curl 访问的 PHP HTTP 服务
Workerman 自带 WebServer 组件,它封装了 HTTP 解析逻辑,比手写 Worker + $_GET 解析靠谱得多。重点不是“能不能跑”,而是“返回能不能被标准 HTTP 客户端识别”。
- 必须
require_onceWorkerman/Autoloader.php,否则类找不到 -
WebServer构造函数第一个参数是监听地址,例如http://0.0.0.0:8080(注意协议前缀是http://,不是tcp://) - 第二个参数是文档根目录路径,比如
__DIR__ . '/public',里面放index.php才会被路由到 - 别漏掉
Worker::runAll(),否则进程立即退出
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\WebServer;
$web = new WebServer('http://0.0.0.0:8080');
$web->addRoot('localhost', __DIR__ . '/public');
Worker::runAll();
curl http://127.0.0.1:8080 返回空或 500?查这三处
HTTP 层面失败,问题通常不在 Workerman 核心,而在你放进去的 PHP 脚本或环境配置上。
-
public/index.php文件权限是否可读?PHP 是否启用了short_open_tag?(如果用了而不是<?php) - 脚本里有没有未捕获的致命错误?加
error_reporting(E_ALL); ini_set('display_errors', '1');到开头临时调试 - Workerman 不加载
.htaccess,重写规则无效;URL 路径必须真实存在对应文件,不支持 Laravel 那种单入口 + rewrite
测试时发现连接超时、反复断开?注意守护进程模式陷阱
php start.php start -d 后看似成功,其实子进程可能已崩溃——Workerman 不会把子进程 stderr 自动转发到主进程日志,出错就静默退出。
立即学习“PHP免费学习笔记(深入)”;
- 首次测试务必先用前台模式:
php start.php start(不加-d),看控制台实时输出 - Linux 下
-d模式依赖pcntl扩展,确认php -m | grep pcntl有输出 - 修改代码后必须
php start.php restart,不能只改文件就刷新浏览器——Workerman 不热重载 - Windows 下不支持
-d,只能前台运行,别浪费时间查“为什么后台没起来”
最常被跳过的动作:没清浏览器缓存就反复测 302/404,或者用 Postman 发 GET 却在代码里只处理 POST ——Workerman 的 HTTP 层很薄,它照单全收,不会帮你纠错。











