必须删除 runtime/container/(或至少 annotation 子目录)的情况包括:首次添加新控制器等注解未被识别、修改 annotations.php 的 paths 或 cacheable 值、调整 dependencies.php 或新增 DI 规则;删后须运行 php bin/hyperf.php di:init-proxy 重建代理,并设 SCAN_CACHEABLE=false 再启动。

因为Hyperf 3.1默认开启注解缓存(SCAN_CACHEABLE=true),扫描结果(如代理类、路由元数据、DI绑定信息)会持久化写入 runtime/container/annotation/ 目录。配置变更(例如修改 config/autoload/annotations.php 中的 paths,或调整 scan.paths)后,旧缓存文件仍存在,框架会直接加载它们,跳过重新扫描——导致新配置不生效,且无任何报错提示。
哪些配置修改必须删 runtime/container
以下情况删掉 runtime/container(或至少 runtime/container/annotation)是必要操作:
- 首次添加新控制器、中间件、命令类等,但注解没被识别
- 修改了
config/autoload/annotations.php的paths或cacheable值 - 调整了
config/autoload/dependencies.php或新增依赖注入规则 - 删过整个
runtime/目录后重新启动服务
删完之后要做什么
仅删除目录还不够,还需重建注解代理和容器元数据:
- 运行
php bin/hyperf.php di:init-proxy—— 这是关键步骤,它会重新扫描注解并生成代理类 - 确保
SCAN_CACHEABLE=false(开发环境建议关闭缓存,避免反复删目录) - 再执行
php bin/hyperf.php start启动服务
为什么 server:watch 不自动处理
server:watch 只监听文件变化并重启 Worker 进程,它不触发 DI 容器重建或注解重扫描。即使代码改了、服务重启了,只要 runtime/container/annotation/ 下的缓存文件还在,框架就继续用旧元数据——所以你会看到“改了配置却没反应”。
不复杂但容易忽略











