Webman热更新失效因reload仅重载autoload.php中files声明的函数文件和函数式route.php,不重载控制器、配置、vendor等;需确保APP_DEBUG=true、非守护模式、关闭opcache.enable_cli,并用inotifywait/fswatch全进程重启。

Webman 没有「热编译」这个概念——它不编译 PHP 代码,只做热重载(reload)或全进程重启。你改了代码没生效,大概率不是编译问题,而是 reload 机制根本没覆盖到你改的文件。
php start.php reload 为什么对控制器/配置无效?
因为 reload 只重新执行 Worker 进程的初始化逻辑(如 onWorkerStart),且仅对两类内容敏感:
-
config/autoload.php中files数组里声明的纯函数文件(如app/functions.php) -
config/route.php(仅限函数式路由写法,比如Route::get();闭包里 new 的控制器类不重载)
以下改了就白改,reload 完全无视:
-
app/controller/*.php—— Composer PSR-4 加载后驻留内存,不会重建实例 -
config/database.php等返回数组的配置文件 —— 通常在onWorkerStart或 bootstrap 阶段一次性require,reload 不再执行 -
vendor/下任何改动 —— 必须start.php restart
APP_DEBUG=true 但 reload 还是没反应?检查这三个硬性条件
reload 是个“娇气”的命令,缺一不可:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 必须未启用守护模式:启动时不能带
-d参数(即php start.php start,不是start -d) -
.env中APP_DEBUG=true必须生效(注意大小写和空格) - 运行
php start.php status,确认状态是Running而非Daemonized—— 后者表示已 detach,reload 直接静默失败
想改完代码立刻生效,别靠 reload,用 inotifywait/fswatch 全进程重启
开发期最稳的方式是监听文件变更后彻底 stop + start,绕过所有 reload 限制:
- Linux:
inotifywait -e modify,move_self,create ./app ./config+php start.php stop && pkill -f "start.php start" && php start.php start -d - macOS:
fswatch -o ./app ./config | xargs -n1 -I{} sh -c "php start.php stop; pkill -f 'start.php start'; php start.php start -d" - 务必加
pkill -f "start.php start"——stop命令常漏杀子进程,残留 Worker 会继续服务旧代码
OPcache 是热更新隐形杀手,关不干净照样卡住
即使设了 opcache.revalidate_freq=0,CLI 模式下仍可能缓存字节码:
- 必须同时关闭
opcache.enable_cli=0(PHP 8.0+ 默认为 1) - 验证方式:改一个控制器文件后,执行
php -r "var_dump(opcache_get_status()['opcache_enabled']);",输出false才算真正关掉 - 如果用 Docker,注意 opcache 配置在容器内生效,宿主机设置无效
opcache.enable_cli 没关、APP_DEBUG 没生效、或你以为改的是 route.php 实际改了闭包里的控制器——这些地方不报错,只沉默地跑旧代码。

















