Workerman生产环境守护需满足三个硬性前提:一是Worker::$pidFile设为绝对路径并确保PHP用户有写权限;二是-d必须配合nohup重定向或systemd托管,禁用-d参数;三是显式配置Worker::$stdoutFile和Worker::$stderrFile绝对路径日志文件。

Workerman服务在生产环境必须长期稳定运行,关掉SSH终端后进程不能退出,崩溃后要能自动拉起,端口持续监听且日志可追溯——这需要真正脱离终端会话、正确设置守护参数、并由系统级进程管理器兜底。
确保-d参数生效的三个硬性前提
Workerman加-d启动后几秒就消失,不是命令写错,而是底层pidFile写入失败导致守护流程中断。必须同时满足以下三点:
第一步:在start.php开头显式声明绝对路径的pid文件:【Worker::$pidFile = '/var/run/workerman.pid';】
第二步:创建目录并赋权(以www-data为例):mkdir -p /var/run/workerman && chown www-data:www-data /var/run/workerman
第三步:确认PHP CLI运行用户(非Web用户)对该路径有写权限,用sudo -u www-data touch /var/run/workerman.pid测试是否报错。
避免假后台:-d必须配合nohup或systemd
单纯php start.php start -d只是fork+setsid,仍继承父会话,关终端时SIGHUP信号会杀死进程。真后台必须切断与终端的绑定关系。
方法一:nohup重定向(适合临时部署或测试环境)
cd到项目根目录 → 执行: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/your/project。
日志不丢、输出可见的关键配置
-d模式下所有echo/var_dump默认被丢进/dev/null,不设日志路径等于黑盒运行。
在start.php中添加两行:
Worker::$stdoutFile = '/var/log/workerman/stdout.log';
Worker::$stderrFile = '/var/log/workerman/stderr.log';
这两条路径也必须是绝对路径,且PHP运行用户有写权限。日志文件不会自动轮转,生产环境需额外配置logrotate。
验证守护是否真正成功
执行systemctl start workerman后立即检查:
① ps aux | grep start.php 看主进程是否存在;
② ls -l /var/run/workerman.pid 确认pid文件已生成且内容为数字;
③ 断开SSH再重新登录,再次执行ps aux | grep start.php,进程仍在;
④ ss -tlnp | grep :2345(替换为你监听的端口)确认端口持续监听。

















