路由缓存未生效主因是APP_DEBUG=true或runtime/route.php未成功生成;需确保app_debug为false、route.php存在且可读、未错误配置route_config_file。

路由缓存没生效,90% 是因为 APP_DEBUG = true 或 runtime/route.php 根本没生成成功——不是配置写错了,是运行时压根没走缓存逻辑。
为什么 route:cache 命令跑完了却还是慢
执行 php think route:cache 后,必须同时满足三个条件缓存才真正启用:
-
APP_DEBUG配置值必须为false(仅靠.env里的APP_DEBUG=true不保险,得确认config/app.php中最终解析结果) -
runtime/route.php文件存在且可读(目录不可写时命令静默失败,不报错也不生成文件) - 没有显式设置
'route_config_file' => []或其他空/错误路径,否则框架跳过加载缓存
常见假象:runtime/route.php 看似存在,但里面是空数组或语法错误(比如闭包里用了 PHP 8.1 特性而 CLI PHP 是 8.0),会导致运行时 fallback 到源码解析。
注解路由缓存特别容易失效的几个点
注解路由(@Route)能缓存,但对环境极其敏感:
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。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,大小写错一个字母就漏掉) - 注解必须写在控制器类或方法上,trait、父类、静态方法里的
@Route不会被采集 - 若用
route/annotation.php自定义了扫描路径,route:cache默认不读它,得加参数:php think route:cache --annotation - PHP 8 Attributes(
#[Route])在 TP8.0.x 中不支持缓存,必须降级为 PHPDoc 注解
route_check_cache 开启后反而 404?
这是运行时路由检查缓存(内存级单请求缓存)和磁盘路由缓存(route.php)混用导致的典型冲突:
-
'route_check_cache' => true会缓存单次 URL+Method 匹配结果,但它的键默认不区分 AJAX/PJAX/HTTPS 等上下文 - 如果同一 URL 在 AJAX 和普通请求中指向不同路由,必须自定义
route_check_cache_key函数,否则缓存击穿后可能调度到错误控制器 - 闭包定义的路由(如
Route::get('test', function(){}))不参与route_check_cache,但会参与磁盘缓存;两者叠加时行为更难预测
建议:生产环境优先保证磁盘缓存(route.php)稳定,route_check_cache 作为二级优化,上线前务必用真实请求组合验证。
CI/CD 中生成缓存最常踩的坑
部署脚本里加 php think route:cache 很常见,但以下问题几乎必现:
- Docker 构建阶段执行该命令 →
runtime目录在镜像里生成,但上线后挂载为卷,缓存文件被清空 - 多节点部署只在一台机器上跑命令 → 其他节点仍用源码解析,负载不均且部分请求变慢
- 命令执行用户无权写
runtime/(尤其用 www-data 用户启动时),需提前chown -R www-data:www-data runtime - 未确保
vendor/autoload.php已加载、think\Container 可实例化 —— 缺少依赖扩展(如 mbstring)也会让命令中途退出
真正安全的做法:在每台服务器上线后、服务启动前,由部署脚本统一执行一次 php think route:cache,并校验 is_file(RUNTIME_PATH . 'route.php') 返回 true。


















