平滑重启workerman 4.0.34需确保版本正确、reloadable=true、pidfile可写,通过php start.php reload等三种方式触发,并验证连接不中断、日志交替记录、请求持续成功。

在生产环境中更新 Workerman 4.0.34 应用代码时,必须避免服务中断,而直接 kill 进程或 stop+start 组合会导致连接断开、请求丢失;平滑重启通过信号机制让旧进程完成当前任务后再退出,新进程同步加载最新代码并接管流量。
确认 Workerman 版本与 reloadable 配置
进入项目根目录,执行 php start.php status 查看当前运行版本及状态,确保输出中包含 Workerman version: 4.0.34;若未显示,说明未正确加载新版 Workerman 或启动脚本引用了旧 Autoloader。
打开启动文件(如 start.php),检查所有 Worker 实例是否未显式设置 $worker->reloadable = false —— 若设为 【false】,则 reload 命令将被忽略,所有子进程不会响应 SIGUSR1,导致平滑重启完全失效。
确认 Worker::$pidFile 已设置且路径可写,否则主进程无法定位子进程,reload 会报 “no pid file” 错误。
触发平滑重启的三种方式
方法一:命令行标准 reload(推荐)
执行 php start.php reload。该命令向主进程发送 SIGUSR1,主进程随即通知全部 Worker 子进程“完成手头请求后优雅退出”,同时 fork 新进程加载当前 PHP 文件与全部 require 的业务代码。
方法二:手动发送系统信号
先通过 ps aux | grep start.php 找到主进程 PID(通常是启动命令所在行中 UID 后第一个数字),再执行 kill -USR1 {PID}。注意:不能对子进程 PID 发送 USR1,否则仅单个 Worker 响应,破坏负载均衡一致性。
方法三:PHP 代码内触发(仅限调试)
在 onWorkerStart 中加入条件判断,例如:if (file_exists('/tmp/reload.flag')) { posix_kill(posix_getppid(), SIGUSR1); unlink('/tmp/reload.flag'); }。此方式绕过命令行,但【不可用于生产环境】,因信号由 Worker 进程发给主进程存在竞态,且无权限校验易被滥用。
验证平滑重启是否生效
第一步:在终端 A 中执行 php start.php reload;
第二步:立即在终端 B 中运行 php start.php connections(需 Workerman ≥ 4.0.20),观察连接数是否持续非零;
第三步:查看日志文件(如 workerman.log)中是否出现交替的 “Worker#0 started” 和 “Worker#0 stopped” 记录,且时间间隔在毫秒级——这表示新旧进程正在重叠运行;
第四步:用 curl 或压测工具持续请求服务接口,确认 HTTP 状态码始终为 200,无 connection refused 或 timeout。
若 reload 后连接数归零或日志中只有 “stopped” 没有后续 “started”,说明主进程未成功拉起新 Worker,大概率是代码语法错误导致新进程启动失败,此时需检查 php start.php start -d 前台启动时的报错输出。











