路由缓存需手动开启配置'sroute_check_cache'=>true,显式定义缓存键回调并执行php think clear --route清理,三者缺一不可,否则性能无提升。

路由缓存不是默认开启的,必须手动配置
ThinkPHP 的路由解析在每次请求时都会重新扫描和匹配所有规则,尤其在大量路由或复杂正则条件下,性能损耗明显。但路由缓存不会自动生效——哪怕你执行了 php think optimize:route,若配置没打开,运行时仍走实时解析。
- 检查
config/route.php或应用主配置(如config/app.php)中是否设置了'route_check_cache' => true - TP6.0+ 默认不启用该开关;TP5.1 需确认是否在
Route::domain()或Route::group()外层调用了->cache(3600)类似方法 - 如果只生成缓存文件(
runtime/route.php),但没开route_check_cache,那它根本不会被读取
缓存键(cache key)不匹配会导致“缓存失效却查不到原因”
ThinkPHP 默认用 $request->url(true) . ':' . $request->method() 作为缓存键,看似合理,但实际场景中极易踩坑:比如你加了 AJAX 检测、Pjax 判断、多域名共用同一套路由,或者用了 URL 重写后带 query 参数的路径,都可能导致两次相同语义的请求生成不同 key,从而反复击穿缓存。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 典型现象:
GET /api/user和GET /api/user?_t=123被视为两个 key,即使业务上完全等价 - 解决方式:显式定义
'route_check_cache_key'回调,例如只取 pathinfo + method:'route_check_cache_key' => function($request) { return $request->pathinfo() . ':' . $request->method(); } - 注意:回调返回值必须是字符串,且应尽量精简,避免含动态内容(如时间戳、随机数)
改了路由不清理缓存,新规则永远不生效
路由缓存一旦生成并启用,框架会跳过所有路由定义文件的加载与解析。这意味着你改完 route.php 或某个模块里的 Route::get(),只要没清缓存,请求依然按旧规则走——而且毫无报错提示,调试时容易误判为代码没生效。
- 清除命令必须用:
php think clear --route(TP6)或php think clear:route(部分 TP5.1 衍生版) - 不要手动删
runtime/route.php:TP6 的优化缓存是二进制结构,直接删可能引发解析异常;用命令才是安全的 - 上线部署脚本里建议固定加入该清理步骤,避免因 CI/CD 缓存残留导致线上路由错乱
静态 HTML 缓存和路由缓存是两回事,别混用
很多人看到 'HTML_CACHE_ON' => true 或 Route::cache(3600) 就以为“缓存开了”,其实这是页面级静态缓存(生成 .html 文件),和路由匹配阶段的内存/文件缓存完全无关。前者影响响应体输出,后者影响请求分发路径,二者可共存但互不替代。
- 判断是否真启用了路由缓存:看
runtime/log/下是否有高频出现的[ROUTE] Matched日志;开启后这类日志应大幅减少 - 若同时用了 Nginx 的 try_files 或 Apache 的 mod_rewrite,确保 rewrite 规则不绕过入口文件(
index.php),否则路由层根本没机会介入,缓存自然无效 - TP6 中
optimize:route命令生成的是 PHP 可执行缓存,而route_check_cache是运行时开关——一个管“有没有缓存文件”,一个管“用不用它”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










