Workerman平滑重启不中断现有连接,即新进程接管新请求、旧进程处理完当前任务再退出;需确保$worker->reloadable = true(默认为true),执行php start.php reload触发,通过日志、长连接测试或PID变化验证。

Workerman平滑重启不中断现有连接,是指在更新代码或配置后,让新进程接管新请求、旧进程继续处理完手头任务再退出,整个过程客户端感知不到服务断开,尤其适用于WebSocket长连接、HTTP Keep-Alive等场景。
确认应用支持平滑重启
打开你的Workerman启动脚本(如start.php),检查是否未显式关闭平滑重启能力。重点查找$worker->reloadable = false;这一行——如果存在且值为false,则平滑重启会被禁用。
若发现该设置,将其改为$worker->reloadable = true;或直接删除该行(默认即为true)。【reloadable设为false会导致php start.php reload命令完全失效,所有请求将被强制中断】
执行平滑重启命令
在项目根目录下,运行以下命令:
php start.php reload
这条命令会向Workerman主进程发送SIGUSR1信号。主进程收到后,不会杀掉任何正在处理请求的Worker子进程,而是启动一组全新Worker进程加载最新代码;老进程完成当前请求后自动退出。
注意:该命令要求Workerman已处于运行状态。若服务未启动,会提示“not running”,此时需先php start.php start -d启动。
验证平滑性是否生效
方法一:观察日志输出
确保Worker::$stdoutFile已设置(如Worker::$stdoutFile = './workerman.log';),然后在终端执行tail -f workerman.log。触发reload后,你会看到类似"Reload start..." → "Reload complete"的日志,且中间没有“Worker stopped”或大量连接重置记录。
方法二:用真实连接测试
保持一个WebSocket客户端或HTTP长连接持续发送心跳请求,同时执行php start.php reload。若连接未断开、消息收发正常、无502/ERR_CONNECTION_RESET错误,则说明平滑重启已生效。
方法三:查看进程PID变化
第一步:执行ps aux | grep start.php,记下Worker进程PID列表;
第二步:执行php start.php reload;
第三步:再次执行ps aux | grep start.php。你会发现旧PID仍在(处理剩余请求),同时新增一批不同PID的Worker进程——这正是平滑切换的典型特征。











