workerman 5.2.3 后台守护运行需同时满足三前提:一、worker::$pidfile设绝对路径并确保php用户可写;二、-d必须配合nohup或systemd,禁止单独使用;三、显式配置worker::$stdoutfile和worker::$stderrfile绝对路径日志文件。

Workerman 5.2.3 开启后台守护运行,核心是正确使用 -d 参数并满足三个关键前提——缺一不可。单纯加 -d 很可能几秒后进程就消失,不是版本问题,而是底层守护流程被中断了。
必须设置绝对路径的 PID 文件
在 start.php 开头(Worker 类引入之后、Worker::runAll() 之前)显式声明:
Worker::$pidFile = '/var/run/workerman.pid';- 路径必须是绝对路径,不能用
__DIR__拼接或相对路径 - 确保 PHP CLI 运行用户(如
www-data或nginx)对该目录有写权限:sudo mkdir -p /var/run/workerman && sudo chown www-data:www-data /var/run/workerman
再测试:sudo -u www-data touch /var/run/workerman.pid,不报错才算通过
禁止单独使用 -d,必须配合 nohup 或 systemd
php start.php start -d 本身只是 fork + setsid,仍继承终端会话;SSH 断开时系统会发 SIGHUP 杀死它。真后台需彻底脱离终端:
-
临时/测试环境:用
nohup重定向cd /path/to/project && nohup php start.php start -d > /dev/null 2>&1 & -
生产环境唯一推荐方式:用
systemd托管
创建/etc/systemd/system/workerman.service,内容中:ExecStart=/usr/bin/php /path/to/start.php start(注意:这里严禁写-d)Type=simple,Restart=always,WorkingDirectory=/path/to/project
必须配置 stdout 和 stderr 日志路径
开启 -d 后所有 echo/var_dump 默认丢进 /dev/null,不设日志等于黑盒运行:
- 在
start.php中添加两行(同样放在Worker::runAll()前):Worker::$stdoutFile = '/var/log/workerman/stdout.log';Worker::$stderrFile = '/var/log/workerman/stderr.log'; - 路径必须是绝对路径,且 PHP 用户对目录有写权限:
sudo mkdir -p /var/log/workerman && sudo chown www-data:www-data /var/log/workerman - 日志不会自动轮转,生产环境建议配
logrotate
验证是否真正成功驻留
执行启动命令后,立即检查以下四点:
-
ps aux | grep start.php:看到多个 workerman 进程,且主进程 PPID 是 1(即被 systemd 接管) -
ls -l /var/run/workerman.pid:文件存在,内容为纯数字 PID - 断开 SSH,重新登录,再次执行
ps aux | grep start.php,进程仍在 -
ss -tlnp | grep :你的端口(如:2345):确认端口持续监听











