Workerman生产环境守护需闭环三件事:一是Worker::$pidFile设绝对路径并确保PHP用户可写;二是显式配置Worker::$stdoutFile和Worker::$stderrFile绝对路径日志文件;三是禁用-d参数,改用systemd托管,Type=simple,Restart=always。

Workerman 5.2.3 安装后添加守护进程,不是“额外安装”某个组件,而是正确配置启动方式与运行环境,让服务真正脱离终端、长期驻留、崩溃自愈、日志可查。关键不在版本号,而在三件事是否闭环:pid 文件可写、标准输出重定向、系统级托管。
必须设置绝对路径的 pid 文件
Worker 进程靠 Worker::$pidFile 记录主进程 ID,守护模式(-d)启动时若无法写入该文件,会立即退出,看似“启动成功”,实则几秒消失。
- 在
start.php开头显式声明(不能依赖默认值):Worker::$pidFile = '/var/run/workerman.pid';
- 创建目录并授权(以常用 Web 用户
www-data为例):sudo mkdir -p /var/run/workerman sudo chown www-data:www-data /var/run/workerman
- 验证 PHP CLI 用户能否写入:
sudo -u www-data touch /var/run/workerman.pid
若报错 Permission denied,说明用户权限或 SELinux 等策略拦截,需先解决。
日志路径必须显式指定且可写
-d 模式下所有 echo/var_dump 默认丢进 /dev/null,不设日志等于盲跑。
- 在
start.php中添加:Worker::$stdoutFile = '/var/log/workerman/stdout.log'; Worker::$stderrFile = '/var/log/workerman/stderr.log';
- 提前建好目录并赋权:
sudo mkdir -p /var/log/workerman sudo chown www-data:www-data /var/log/workerman sudo chmod 755 /var/log/workerman
- 注意:Workerman 不自动轮转日志,生产环境需配合
logrotate配置。
生产环境必须用 systemd 托管(禁用 -d 参数)
单独 php start.php start -d 是伪守护:它只做 fork + setsid,仍继承终端会话,SSH 断开时可能收到 SIGHUP 被杀。真守护必须由系统初始化进程(PID 1)接管。
-
创建服务单元文件:
sudo nano /etc/systemd/system/workerman.service
-
内容如下(注意:
ExecStart中不加-d,Type=simple):[Unit] Description=Workerman HTTP/WebSocket Server After=network.target [Service] Type=simple User=www-data Group=www-data WorkingDirectory=/path/to/your/project ExecStart=/usr/bin/php /path/to/your/project/start.php start Restart=always RestartSec=3 StandardOutput=null StandardError=null [Install] WantedBy=multi-user.target
-
启用并启动:
sudo systemctl daemon-reload sudo systemctl enable workerman sudo systemctl start workerman
验证是否真正守护成功
别只看“Start success.”,要实测四个点:
-
ps aux | grep start.php→ 主进程 PPID 应为 1(被 systemd 托管) -
ls -l /var/run/workerman.pid→ 文件存在,内容是纯数字 PID - 断开 SSH,重新登录,再执行
ps aux | grep start.php→ 进程仍在 -
ss -tlnp | grep :2346(替换为你监听的端口)→ 端口持续监听,且进程名关联正确
不复杂但容易忽略

















