Workerman启动时需显式指定绝对路径的pidFile并确保权限,且systemd管理下必须前台运行:新版用--daemon=0,旧版用-d=false。

Workerman启动时,很多人只记得加-d就完事,结果服务在后台静默退出、systemd反复重启失败、日志里查不到错误、pid文件写不进目录——这些都不是偶然,而是几个关键参数被跳过了。
必须显式指定的pidFile路径
Workerman默认pid文件路径是workerman.pid(相对路径),但守护模式下工作目录可能变化,导致写入失败且无报错。
在start.php中,必须手动设置绝对路径:
$worker->pidFile = '/var/run/workerman.pid';
【/var/run/目录需确保当前运行用户有写权限,否则-d会静默失败】。常见坑是用root启动后切换User=www-data,但/var/run/workerman.pid仍属root,www-data无法覆盖。
建议改用项目内runtime目录:$worker->pidFile = __DIR__ . '/runtime/workerman.pid';,并提前创建该目录且chmod 755。
--daemon=0(新版)或-d=false(旧版)
systemd管理Workerman时,主进程必须前台运行,否则systemd会判定“启动超时”并杀掉进程。
方法一:新版Workerman(>=4.1)用--daemon=0
php start.php start --daemon=0
方法二:旧版Workerman(-d=false
php start.php start -d=false
注意:【-d参数不能和--daemon=0混用,否则参数冲突导致Worker::runAll()直接返回而不启动】。
限制文件描述符数量(ulimit -n)
Workerman高并发依赖大量socket连接,Linux默认ulimit -n通常只有1024,远不够用。
第一步:临时提高当前终端限制ulimit -n 65535
第二步:永久生效需修改系统配置
编辑/etc/security/limits.conf,追加两行:
www-data soft nofile 65535www-data hard nofile 65535
第三步:确认systemd服务中未覆盖该限制
在workerman.service的[Service]段添加:
LimitNOFILE=65535
不设此项,即使limits.conf改了,systemd也会按默认值(通常是4096)启动进程,导致启动时报“Too many open files”后秒退。
强制指定PHP可执行路径
systemd环境下,PATH环境变量受限,常出现/usr/bin/php: not found错误,尤其当PHP装在/opt或自编译路径时。
在workerman.service文件中,ExecStart必须写绝对路径:
ExecStart=/opt/php/bin/php /var/www/myapp/start.php start --daemon=0
别依赖which php或软链接,systemd不会解析shell别名或~符号。
关闭SIGHUP信号接管
Workerman默认未处理SIGHUP,若用nohup启动,子进程仍可能因父进程退出而中断。
正确做法是在start.php中显式忽略:
pcntl_signal(SIGHUP, SIG_IGN);
这行必须放在Worker::runAll()之前,且需确保PHP启用了pcntl扩展。没这句,某些容器环境或systemd reload时Worker进程会意外退出。

















