workerman启动失败直接源于php版本过低(需≥7.4)、zts模式冲突、pcntl/sockets扩展缺失、函数被禁用、监听地址错误(应为0.0.0.0)、端口占用或特权端口限制、windows下未启用单进程模式及自动加载路径错误。

Workerman启动失败是因PHP环境不兼容、核心扩展缺失、监听配置错误或权限限制等具体问题直接引发,不是抽象的“配置不当”或“环境问题”。
检查PHP版本与线程安全模式
执行 php -v 确认版本不低于7.1;若为Workerman v5+,必须使用PHP ≥ 7.4(尤其需fiber支持)。【zts模式会导致pcntl_fork()静默崩溃】
运行 php -i | grep "thread safety",输出 enabled 表示启用线程安全——这是Workerman的致命冲突点,必须切换为nts(非线程安全)PHP二进制文件。
验证pcntl与sockets扩展是否就位
Workerman依赖pcntl实现多进程,依赖sockets创建网络连接。缺一不可。
方法一:用命令快速检测
php -m | grep -E "pcntl|sockets" —— 若无任何输出,说明至少一个扩展未启用。
方法二:检查函数是否被禁用
运行 php -i | grep disable_functions,确认 pcntl_fork、stream_socket_server、shell_exec 等未出现在禁用列表中。若存在,需编辑对应php.ini,删除这些函数或整行注释掉。
排查监听地址与端口冲突
第一步:打开start.php,定位Worker实例化语句
检查是否写成 new Worker('tcp://127.0.0.1:2345') —— 这会导致外部设备完全无法连接,必须改为 new Worker('tcp://0.0.0.0:2345')。
第二步:确认端口未被占用
执行 ss -tuln | grep :2345(或用 netstat -tuln | grep :2345),若已有进程监听该端口,要么杀掉原进程,要么修改Workerman配置换端口。
第三步:避开特权端口限制
若监听端口 ≤ 1024(如80、443),Linux会返回 Permission denied 错误。开发阶段请改用1025以上端口;生产环境如确需低号端口,必须用root权限启动(sudo php start.php start)。
Windows系统下强制单进程模式
Windows原生不支持fork(),Workerman在此平台只能以单进程调试模式运行。
必须使用 php start.php start -d 启动,严禁添加 --daemon 或 -p 参数。
在start.php开头插入兼容判断代码:
if (stripos(PHP_OS, 'WIN') === 0) { WorkermanWorker::$pidFile = ''; WorkermanWorker::$stdoutFile = './logs/stdout.log'; }
这一步能防止Workerman尝试写入系统临时目录失败,也避免因pid文件丢失导致后续stop命令失效。
修复自动加载与依赖路径
方法1:重装vendor依赖
进入项目根目录,执行 rm -rf vendor composer.lock → composer install --no-dev -o → 检查 ls vendor/workerman/ 是否存在 Worker.php 文件。
方法2:手动引入核心类(临时绕过autoload故障)
打开start.php,在 require_once __DIR__ . '/vendor/autoload.php'; 下方追加:require_once __DIR__ . '/vendor/workerman/workerman/Worker.php';。
方法3:修正composer.json中的PSR-4映射
在 "autoload": {"psr-4": {...}} 内加入 "Workerman\": "vendor/workerman/workerman/",再执行 composer dump-autoload -o。











