Workerman怎么实现平滑重启(Reload)?原理是什么?

冬婷吖_5631

冬婷吖_5631

2026-05-24

986人浏览

原创

workerman 的 reload 命令仅平滑替换 worker 子进程,重载 onmessage 等回调中动态加载的代码,但不生效于类定义、opcache、静态配置等;其本质是 sigusr1 信号触发子进程逐个重启,非全量热更新。

workerman怎么实现平滑重启(reload)?原理是什么?

Workerman 的 php start.php reload 确实能平滑重启,但只对“动态加载的代码”生效;类定义、配置、OPcache 缓存、define()、静态属性等完全不受影响——这不是 bug,是设计使然。

reload 命令到底重载了什么?

它不重启主进程,也不重新执行整个启动脚本,而是向主进程发送 SIGUSR1 信号,触发主进程逐个替换 Worker 子进程:

  • 老 Worker 进程处理完当前请求后才退出(不丢连接、不中断 HTTP 流)
  • 新 Worker 进程启动时会重新解析并执行 onMessage、onConnect、onWorkerStart 等回调里的 PHP 代码
  • 但仅限于“运行时动态加载”的部分:比如在 onMessage 里用 require './logic.php' 引入的文件
  • 写死在 onWorkerStart 开头的 $config = ['host' => 'old'];,reload 后仍是旧值

为什么改了代码 reload 后接口还是返回旧结果?

这是最常被误判为“reload 失效”的场景,本质是代码没走 reload 路径。常见原因:

  • app/controller/Api.php 这类文件由 Composer autoloader 加载,属于“首次加载即固化”,reload 不会重新 require 它
  • opcache.enable_cli=1 开启时,CLI 模式下 OPcache 不自动校验文件修改时间,新 PHP 文件仍执行旧字节码
  • 用了 webman\support\Bootstrap 或 config/bootstrap.php 预加载机制,这些在 Worker 初始化阶段就完成了,reload 不重跑
  • onWorkerStart 中一次性 require 所有业务类,而不是在 onMessage 中按需加载

验证是否真生效:别信终端的 Reload success,查 php start.php status 输出的 Worker PID 是否变化,或翻 runtime/log/worker.log 是否有新 worker#0 started 记录。

青虎AI
青虎AI

青虎AI是面向电商行业的AI视觉内容与智能运营一站式平台。

下载

Monitor 自动 reload 真的平滑吗?

Workerman 的 Monitor 组件监听文件变更后调用 posix_kill($pid, SIGINT),这和 reload 完全不是一回事:

  • SIGINT 等效于 Ctrl+C,主进程立即终止所有 Worker,不等待当前请求完成
  • 它不走 SIGUSR1 + 逐个替换路径,存在极小概率丢失正在处理的请求(压测中约万分之一失败率)
  • 内存超限触发的也是 SIGINT,同样不是平滑
  • 生产环境必须关闭 Monitor 自动重启:'enable_file_monitor' => false

reload 不行时,该用 restart 还是手动清理?

当遇到以下情况,reload 无意义,必须换方式:

  • 修改了 Worker 构造参数(如监听地址、$worker->count)、启动脚本逻辑 —— 必须 php start.php restart(有秒级中断)
  • 改了类定义、const、define()、静态属性 —— 只能 restart 或手动清 OPcache(opcache_reset())
  • 想保留进程但刷新配置?可设 $worker->reloadable = false,配合 onWorkerReload 回调做运行时重载(如 C(load_config()))

真正容易被忽略的是:reload 的“平滑”只对网络层连接和请求生命周期有效,对 PHP 运行时状态(符号表、OPcache、已加载类)完全无感——它不是热更新,只是子进程轮换。别指望它解决所有代码更新问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

146

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

182

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

167

13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

120

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

40

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

40

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

40

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习