ThinkPHP 8.0 路由缓存默认不生效,必须同时满足 APP_DEBUG = false、runtime/ 目录可写、且成功执行 php think route:cache;任一条件缺失或 runtime/route.php 权限/路径不匹配,均导致静默回退至慢解析。

路由缓存在 ThinkPHP 8.0 中默认不生效,必须同时满足三个硬性条件:APP_DEBUG = false、runtime/ 目录可写、且手动执行过 php think route:cache。漏掉任一条件,哪怕 runtime/route.php 文件存在,请求时也照样走慢解析路径。
为什么 php think route:cache 执行成功却没提速?
常见错觉是“文件生成了=缓存启用了”,但实际运行时框架根本不读它。关键判断点只有两个:
-
APP_DEBUG必须为false—— 不是靠环境变量或 .env 里设了就完事,得确认config/app.php里最终值确实是'app_debug' => false -
runtime/route.php文件必须对 Web 进程(如 Nginx 的www-data用户)可读;CLI 下生成的文件若属主是ubuntu,而 Web 进程无法读取,就会静默 fallback 到源码解析 -
config/app.php中不能显式设置'route_config_file' => []或指向空路径,否则会跳过缓存加载逻辑
注解路由(@Route)缓存失败的典型原因
注解路由比数组路由更容易踩坑,缓存阶段就可能漏掉规则:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 控制器类必须放在
app/controller/下,且命名空间严格匹配 PSR-4(如app\controller\User对应app/controller/User.php),大小写不符(Linux 下尤其致命)会导致扫描失败 -
@Route注解只能写在控制器类或方法上,写在 trait、父类、或非app/controller/下的类里,route:cache命令压根不会采集 - 若用
route/annotation.php自定义了扫描路径,php think route:cache默认不读该配置,必须加参数:php think route:cache --annotation - PHP 8 Attributes(如
#[Route('user')])在 TP8.0.x 中不支持缓存,必须降级为 PHPDoc 风格注解
php think optimize 和单独 route:cache 的区别
php think optimize 是一键打包命令,它内部会依次执行 config:cache、route:cache、schema:cache,但有隐藏风险:
立即学习“PHP免费学习笔记(深入)”;
- 它不会校验
runtime/权限,若目录不可写,某个子命令静默失败,你却以为全量优化完成了 - CI/CD 中常在部署脚本里跑这个命令,但若在 Docker build 阶段执行,生成的
route.php路径和上线后 runtime 挂载路径不一致,缓存文件直接失效 - 多服务器部署时,
optimize必须在每台机器上单独运行,不能共享同一份缓存文件——因为缓存内容里包含绝对路径、主机名等上下文信息
最易被忽略的是:改了 route/app.php 或任意一个控制器里的 @Route 注解后,缓存不会自动更新。不重新跑 php think route:cache,新路由永远 404,旧路由继续生效——这不是 bug,是设计如此。


















