hyperf watcher 默认不监听 config/ 和 runtime/ 目录,改配置不会自动重启;需在 config/autoload/watcher.php 中显式添加 'config' 到 watch.dir,runtime/ 不建议监听,.env 需加入 watch.file,且须通过 php bin/hyperf.php watch 启动。

Hyperf Watcher 默认不监听 config/ 和 runtime/ 目录,改了配置不会重启,这是最常被卡住的地方。
为什么改了 config 文件没反应?
Hyperf Watcher 的默认监听路径是 app/、bin/、bootstrap/,不包含 config/。它也不监听 runtime/(比如 runtime/container 里的注解缓存),所以即使你清了缓存,改完配置后进程也不会自动重启。
- 必须显式在
watcher.php配置中加入'config'目录 -
runtime/不建议加入监听——它会被频繁写入,容易触发误重启;应靠clear-cache命令手动刷新 - 若使用注解扫描(如
@Controller),改了config/autoload/annotations.php后必须重启,否则新规则不生效
如何正确配置 watcher.php?
在 config/autoload/watcher.php 中调整 watch 数组,覆盖默认行为。注意:这个文件需手动创建,Hyperf 不自带。
return [
'watch' => [
'dir' => ['app', 'bin', 'bootstrap', 'config'], // 加上 config
'file' => ['.env'],
'scan_interval' => 2000,
],
];
-
dir是监听目录,支持相对路径(相对于项目根目录) - 不要写成
'config/'或./config,Watcher 会自动拼接,多斜杠或点号会导致路径解析失败 - 如果用了自定义命令行脚本(如
bin/import.php),记得把它所在目录也加进dir
启动时提示 “No watchers configured” 怎么办?
这说明 watcher.php 没被加载,常见于配置路径错误或未启用组件。
- 确认文件路径是
config/autoload/watcher.php,不是config/watcher.php或其他位置 - 检查
composer.json中是否启用了hyperf/watcher:运行composer show hyperf/watcher - 确保
bin/hyperf.php start是通过php bin/hyperf.php watch启动的,而不是直接start - Hyperf 3.x 要求 PHP >= 8.1,低版本可能因反射异常静默跳过 watcher 初始化
修改 .env 后没重启?检查 file 监听和 dotenv 加载时机
.env 属于 file 类型监听项,但 Hyperf 在启动早期就加载了环境变量,Watcher 只能触发重启,不能热更新 $_ENV。
- 确保
watcher.php中file包含'.env'(注意带点) - 改完
.env后,Watcher 会杀掉旧进程并拉起新进程,但新进程仍要重新走一遍Dotenv::load() - 如果用的是
hyperf/config-nacos等远程配置,Watcher 完全无效——这类配置靠心跳轮询,不依赖文件变更
真正影响开发效率的,往往不是“能不能重启”,而是“重启后有没有真正加载新配置”。每次加监听目录前,先想清楚:这个文件改动后,是否真的需要整个服务重启?还是只需 reload 某个组件?后者更适合用 hyperf/reload 或自定义信号处理。










