状态码256表明php子进程因致命错误(如禁用函数调用、扩展段错误)被内核强制终止,对应信号1;需立即检查disable_functions(重点pcntl_fork、posix_kill)、运行官方检测脚本curl -ss http://www.workerman.net/check.php | php,并确认log_errors=on且error_log路径可写。

Workerman 进程退出状态码 256 怎么看?
看到 exit with status 256 就别翻业务日志了,这根本不是 PHP 异常,而是 PHP 子进程被内核强制终止(等价于收到信号 1 或发生段错误)。Workerman master 进程本身不崩溃,但所有 worker 都退出,服务就断了。
- 用
ps aux | grep start.php确认 master 是否还在;如果没了,是 master 崩了;如果还在但没 worker 进程,就是 worker 全挂了 - 查
workerman.log最末尾,找类似Worker[xxx] exit with status 256的记录 - 立刻运行
php -i | grep disable_functions,重点盯pcntl_fork、posix_kill、posix_getpid—— 这些被禁,master 根本无法 fork 或管理 worker - 跑一次
curl -Ss http://www.workerman.net/check.php | php,它会直接告诉你哪些关键函数被拦住了
为什么 workerman.log 里啥都不写?
Workerman 默认不把 PHP 错误输出到日志文件,尤其在守护进程模式下:display_errors=Off + error_reporting 不开 = 所有 fatal error、warning 全部静默消失。
- 在
start.php开头紧贴<?php加两行:error_reporting(E_ALL); ini_set('display_errors', 'on'); - 再加一行:
use Workerman\Config; Config::$debug = true;—— 这能让 Workerman 自己打启动/退出/信号等内部动作 - 别用
echo或var_dump()调试:它们输出位置不可控,容易被缓冲或混进系统日志;改用file_put_contents('/tmp/workerman-debug.log', "xxx\n", FILE_APPEND) - 确认
Worker::$logFile指向的路径有写权限,且磁盘没满(df -h看一眼)
客户端连不上,但 ss -tuln 看不到监听端口怎么办?
端口没监听 ≠ Workerman 启动失败,很可能是 worker 进程压根没起来。master 启动了,但 onWorkerStart 里抛了未捕获异常,worker 就直接退出,master 也不报错。
- 先执行
ss -tuln | grep :你的端口:没输出 = kernel 层根本没监听;只有127.0.0.1:端口= 绑定错了,得改成tcp://0.0.0.0:端口 - 再跑
ps aux | grep WorkerMan:只看到master process没有worker process,基本就是 onWorkerStart 出问题了 - 临时把
onWorkerStart里逻辑注释掉,只留Worker::log('ok'),看 worker 能否稳定起来;能,就逐步放开代码定位哪行触发崩溃 - 检查是否用了
SO_REUSEADDR,TIME_WAIT 太多导致 bind 失败 —— Workerman 不报错,但就是不监听,客户端连就 Connection refused
没有 core dump,怎么定位 PHP 扩展崩溃点?
生产环境通常关了 core dump,但崩溃点其实还能从蛛丝马迹里找。
- 用
strace -f -e trace=clone,execve,openat,kill -p $(pgrep -f "start.php")抓 worker 启动时的系统调用,看到clone成功但后续立刻kill自己,大概率是扩展初始化失败 - 临时换一个干净的 PHP 环境(比如 CLI 下单独跑
php -m看有没有 segfault,或php -v是否卡住) - 禁用可疑扩展:在 php.ini 里注释掉
extension=xxx.so,尤其是刚升级过的 swoole、redis、grpc 等 C 扩展 - 如果用了 Docker,确认 base 镜像里
pcntl和posix是编译进 PHP 的,不是动态加载 —— 很多 alpine 镜像默认不带
disable_functions 和 display_errors 的组合杀伤力,它能让一切错误彻底隐形。











