tp6路由缓存失效主因是route.php被意外清空或未正确生成,需检查是否高频清理runtime、确认route_cache配置为true并执行php think route:cache生成非空文件,同时规避opcache冲突与调试模式干扰。

TP6 接口路由缓存失效,通常不是缓存“没生效”,而是被意外清空、未命中或配置冲突导致的假性失效。重点不在加缓存,而在稳住缓存生命周期。
检查 Runtime 目录是否被高频清理
ThinkPHP 6 的路由缓存依赖 Runtime 目录下的 route.php 文件。若该文件每次请求都重建或消失,说明有逻辑在主动清缓存:
- 全局搜索项目中是否调用
think\facade\Cache::clear()、think\facade\Route::clear()或执行php think clear:route类命令 - 排查 BaseController 或中间件中是否存在类似
delRuntime()、unlink(…/route.php)等手动删文件操作 - 对比正常环境与异常环境的
runtime/route/目录:若文件生成后几秒内就不见,基本可锁定是代码层强制刷新
确认路由缓存是否真正启用
TP6 默认不自动开启路由缓存,需显式配置并生成:
- 确保
config/app.php中'route_cache' => true已开启 - 执行命令生成缓存:
php think route:cache(注意不是route:build) - 生成后检查
runtime/route.php是否存在且非空;若为空,可能是路由定义含闭包、动态变量或未规范注册 - 避免在路由定义中使用
function() {}或依赖容器未初始化的类,这些会导致缓存构建失败静默跳过
规避 OPcache 与 Runtime 冲突
OPcache 启用时若 Runtime 文件频繁变更,会引发字节码重编译和内存抖动,间接导致缓存“失灵”:
- 确认
opcache.revalidate_freq = 0或设为较大值(如 60),避免每秒检查文件更新 - 禁用开发环境的
opcache.validate_timestamps = 1(生产环境应为 0) - 若使用 Docker 或 NFS 挂载 Runtime 目录,需确认文件系统支持 inotify,否则 OPcache 可能无法感知变更而缓存旧内容
验证请求是否命中缓存路由
缓存启用后,并非所有请求都会走缓存——某些条件会自动降级:
- 带 query 参数的 URL(如
/api/user?id=1)默认不走缓存路由,除非显式配置Route::rule('user', 'api/user')->option(['complete_match' => false]) - 使用
Url::build()生成链接时,若传入动态参数或未设置['suffix' => ''],可能导致 URL 不一致,缓存匹配失败 - 开启调试模式(
app_debug = true)时,路由缓存会被绕过,务必在部署后关闭调试











