Workerman进程启动后几秒内自动退出是因pidFile路径不可写或非绝对路径、pcntl_fork/posix_kill被禁用、PHP致命错误或终端关闭触发SIGHUP所致,需分别检查pid文件配置、PHP扩展与禁用函数、错误捕获及运行模式。

Workerman进程启动后几秒内自动退出,不是程序崩溃而是配置或环境问题导致的静默失败,常见于加-d参数后仍无法常驻、ps查不到进程、日志为空或只有“Start success”。
守护模式未真正生效
执行php start.php start -d后进程消失,根本原因是-d虽触发fork,但【pidFile路径不可写或非绝对路径】会导致守护失败且不报错。
打开start.php,找到Worker实例化后的代码段,在$worker = new Worker(...)之后立即添加:
$worker->pidFile = '/var/run/workerman.pid';
确保该路径父目录存在且可写:sudo mkdir -p /var/run && sudo chown www-data:www-data /var/run(若运行用户是www-data)。
绝对禁止使用workerman.pid、./runtime/pid等相对路径——daemon模式下工作目录可能变化,导致pid文件写入失败。
PHP核心扩展被禁用
master进程启动几秒后退出,日志里找不到错误,最可能的原因是pcntl_fork或posix_kill被disable_functions拦截。
方法一:运行检测脚本定位问题
curl -Ss http://www.workerman.net/check.php | php
该脚本会明确列出缺失的扩展和被禁函数,pcntl_fork和posix_kill必须显示OK,否则master无法创建worker子进程。
方法二:手动验证关键扩展
php -m | grep -E "pcntl|posix|sockets"
若无输出,说明对应扩展未启用;若输出不全,需检查php.ini中extension=pcntl.so等是否取消注释。
方法三:检查禁用函数列表
php -i | grep disable_functions
若结果包含pcntl_fork、posix_kill、pcntl_wait、pcntl_signal等,必须编辑php.ini注释掉对应条目,然后重启PHP服务。
PHP进程自身发生致命错误
看到日志中出现exit with status 256,说明PHP子进程被内核强制终止,这不是Workerman逻辑错误,而是PHP层崩溃。
第一步:在start.php最开头插入错误捕获代码
ini_set('display_errors', 'on'); error_reporting(E_ALL);
第二步:确认是否调用了被禁函数或存在段错误扩展
第三步:检查是否启用了ZTS(线程安全)模式——pcntl与ZTS冲突,运行php -i | grep "thread safety",若显示enabled则必须切换为NTS版本PHP。
第四步:临时关闭所有自定义error_handler,防止其屏蔽fatal error输出。
终端关闭触发SIGHUP中断
直接运行php start.php start(不带-d)时,Workerman以前台模式运行,SSH断开或关闭终端窗口会发送SIGHUP信号,整个进程树立即终止。
这并非故障,而是设计行为。开发调试可用此模式,但生产环境必须加-d或改用systemd托管。
切勿用nohup php start.php start &替代-d——Workerman未处理SIGHUP,子进程仍会被中断。

















