讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬婷吖_5631

冬婷吖_5631

发布时间:2026-05-24 19:44:36

|

986人浏览过

|

来源于php中文网

原创

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 记录。

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、已加载类)完全无感——它不是热更新,只是子进程轮换。别指望它解决所有代码更新问题。

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

146

2026.05.20

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

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

182

2026.05.20

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

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

167

2026.05.20

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

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

120

2026.09.23

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

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

60

2026.09.23

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

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

40

2026.09.23

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

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

40

2026.09.22

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

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

40

2026.09.22

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

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

40

2026.09.22

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn