Webman的reload仅重载Worker进程中动态加载的代码,不刷新类定义、const、OPcache、静态配置及onWorkerStart逻辑;改这些必须用restart。

Webman 的 reload 命令不是“重启整个 PHP 进程”,它只刷新 Worker 进程中动态加载的代码;真要换类定义、改配置、更新 const,必须用 restart 或手动 kill + start。
reload 为什么经常“看起来没生效”
终端显示 Reload success 不代表你改的代码已上线。根本原因是:reload 只触发 Worker 进程退出后重新 fork 并执行 onMessage 等回调逻辑,但不会重新 require 类文件、不重解析 const、不刷新 OPcache 缓存、不重跑 onWorkerStart 里的初始化代码。
- 你在
app/controller/Api.php里改了echo 'v2';,但该类由 Composer autoloader 加载 —— reload 不会触发 autoloader 重载,内存里还是旧类 - 你在
onWorkerStart里写了$config = ['host' => 'old'];,reload 后这个变量值永远不变 - OPcache 开启且
opcache.enable_cli=1(CLI 模式下也缓存),新 PHP 文件根本没被解析,直接执行旧字节码 - 用了
webman\support\Bootstrap或在config/bootstrap.php提前require了类 —— 这些都在 Worker 初始化阶段完成,reload 不会重跑
什么时候该用 reload,什么时候必须 restart
判断依据不是“我改了代码”,而是“改的是哪一层的逻辑”。
-
reload适用场景:仅修改了onMessage/onRequest回调内部的require文件、或通过C()动态加载的配置(比如C('database.host')) -
restart必须场景:改了类定义、const、define()、config/app.php静态配置、onWorkerStart逻辑、监听端口、$worker->count等 Worker 构造参数 -
stop+start和restart行为一致,但restart是原子命令,推荐优先用它
验证 reload 或 restart 是否真实生效
别信终端输出,得看进程和日志。
立即学习“PHP免费学习笔记(深入)”;
- 执行
php start.php status,检查httpworker 的 PID 列是否全部变化 —— 不变说明没真正重启 - 翻
runtime/log/worker.log,搜worker#0 started时间戳,确认是否有新记录(注意:Monitor 进程不参与 reload,它的 PID 不变是正常的) - curl 接口返回内容前,先用
php -d opcache.enable_cli=0 start.php reload临时禁用 OPcache 测试 —— 如果这时生效了,问题就锁定在 OPcache 配置上 - 若用 Supervisor 管理,务必确认配置含
stopasgroup=true和killasgroup=true,否则restart可能残留子进程
最常被忽略的一点:Webman 的 reload 机制完全依赖 PHP 进程自身的生命周期管理,它不碰 OPcache、不碰 autoloader、不碰预加载逻辑。你以为 reload 是“刷新代码”,其实它只是“让 Worker 进程重新走一遍请求入口”。想绕过这个限制,就得接受 restart 带来的秒级中断,或者把逻辑下沉到可动态加载的层级。



















