php start.php reload 是唯一可靠的优雅重启方式,它通过 SIGUSR1 信号实现平滑更新:旧进程处理完现有请求后退出,新进程加载最新代码并接管流量;而 stop 仅发 SIGINT 强制终止,-g 参数无效,restart 则存在服务空白期。

php start.php stop 是默认停止方式,php start.php reload 才是真正的优雅重启命令——它不中断正在处理的请求,也不需要先停再启。
stop 命令到底做了什么?
php start.php stop 默认发送 SIGINT 信号,主进程立即终止所有 Worker 子进程,但不会等待当前连接处理完。常见现象包括:
- WebSocket 连接突然断开,客户端收到
1006错误 - HTTP 请求返回空响应或超时
- 长任务(如文件上传、数据库事务)被强制中断
如果你加了 -g 参数(php start.php stop -g),它其实等价于普通 stop,Workerman 并不支持真正意义上的 graceful stop —— 官方文档里这个 -g 是误导性参数,实际行为没区别。
reload 才是唯一可靠的优雅重启
php start.php reload 向主进程发送 SIGUSR1,触发平滑更新机制:
- 旧 Worker 进程不再接受新连接,但继续处理已有请求直到完成
- 主进程立即 fork 新 Worker,加载最新代码和配置
- 新旧进程并存,流量自动切到新进程,用户无感知
- 旧进程全部退出后,内存释放,PID 文件自动更新
注意:reload 要求你的 start.php 中已正确设置 Worker::$pidFile,否则找不到主进程,报错 Can't find pid file。
restart 命令本质是“停+启”,不是优雅的
php start.php restart 内部执行的是 stop → start 两步,中间存在服务空白期:
- 哪怕只有 100ms,也可能丢失心跳包、重连请求或短连接
- 如果
start失败(比如端口被占、配置语法错),服务就卡在“已停未启”状态 - 带
-d的restart -d只影响启动模式,不改变非优雅本质
所以生产环境应避免 restart,只用 reload;只有代码结构大改(如修改了 Worker 类定义本身)、无法热加载时,才考虑先 stop 再 start。
容易被忽略的关键点
真正让 reload 可靠运行的三个前提经常被跳过:
-
Worker::$pidFile必须显式指定且路径可写(如/var/run/workerman.pid) - Worker 进程不能有阻塞式
sleep()、fgets()或未设超时的stream_socket_client() - 全局静态变量、单例对象的状态不会继承给新进程——如果你依赖
static $cache,它会在 reload 后清空

















