TP8.0路由缓存清除后仍走旧路由或注解不生效,主因是缓存残留、APP_DEBUG=true跳过缓存、route.php路径污染或未在目标环境现场生成;须用php think clear:route清除、确认APP_DEBUG=false、执行php think route:cache --annotation重建,并验证runtime/route.php是否被Web进程正确加载。

ThinkPHP路由缓存清除后接口仍走旧路由、新@Route注解不生效、404错误未消失——这不是代码没改对,而是缓存文件残留、加载路径错位或运行时配置未同步导致的路由匹配逻辑被绕过。
确认当前是否真正在用缓存路由
不能只看 runtime/route.php 文件是否存在,得验证运行时实际加载路径。在任意控制器方法中插入以下两行并访问对应接口:
dump(\think\App::debug());<br>dump(is_file(RUNTIME_PATH . 'route.php'));
第一行输出 【true】 表示 APP_DEBUG=true,此时无论 route.php 是否存在,框架都会跳过缓存、重新解析全部路由定义;第二行输出 false 说明缓存文件根本没生成或被误删,缓存逻辑从源头就断了。
立即学习“PHP免费学习笔记(深入)”;
彻底清除路由缓存的三种方式
方法一:使用命令行工具(推荐)
执行 php think clear:route,该命令会精准删除 runtime/cache/route.php(TP8.0 默认路径)及所有关联临时文件,不依赖目录权限判断,也不受 IDE 隐藏文件干扰。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
方法二:手动删除文件(需谨慎)
进入项目根目录,执行 rm -f runtime/cache/route.php;若项目启用了多应用,还需同步删除各应用下的 runtime/cache/route.php(如 app/admin/runtime/cache/route.php)。
方法三:强制刷新并重建(适用于注解路由变更后)
第一步:先清空旧缓存 → php think clear:route
第二步:确保 APP_DEBUG=false 且 runtime/ 可写 → 否则 route:cache 命令静默失败
第三步:重新生成 → php think route:cache --annotation(若使用注解路由)
检查路由缓存是否含绝对路径污染
TP8.0 的 runtime/route.php 是完全静态文件,不含版本号或哈希校验,一旦生成就直接 require。如果该文件是在构建机上生成后打包进 Docker 镜像,而上线后 runtime/ 是挂载的空目录或只读卷,Web 进程将无法读取 route.php,自动 fallback 到慢速动态解析——此时你看到的“旧路由”其实是未缓存状态下的历史解析结果。
必须在目标环境以 Web 进程用户权限现场生成:【禁止在 CI/CD 构建阶段生成 route.php 后分发】,否则不同机器上 __DIR__ 解析路径不同,会导致控制器类加载失败。
验证路由是否真正重载
① 修改一个已知能访问的路由规则,在 route/app.php 或 @Route 注解中加个无害变动(例如把 GET /user 改成 GET /userx);
② 执行完整清除+重建流程;
③ 直接访问新路径,观察是否返回 404 或正确响应;
④ 若仍 404,立即检查 Web 服务器错误日志,确认是否报 Class not found 或 require(): failed to open stream —— 这说明 route.php 被加载但其中引用的控制器路径失效,根源是缓存文件里固化了错误的绝对路径。
这一步操作起来很简单,直接把文件拖进去就行。


















