thinkphp6清除缓存后接口仍返回旧数据,需逐层排查:先确认缓存驱动类型及配置,检查路由缓存、查询缓存、标签缓存、redis前缀匹配、模板/代理缓存是否遗漏清理,验证app_debug状态及权限问题。

ThinkPHP6清除缓存后接口仍返回旧数据,说明缓存未真正清空或请求绕过了预期缓存层——可能是路由缓存、查询缓存、模板缓存、Redis前缀错配或多级缓存残留导致。
确认是否清的是“对的缓存”
先查 config/cache.php 里 default 驱动是 file 还是 redis;若为 redis,再看 stores.redis.prefix 配置值(如 'think_cache:'),【php think clear:cache 命令只清默认驱动,不处理自定义前缀】。运行 php think clear:cache 后,用 redis-cli 执行 keys "think_cache:*" 验证是否还有残留键。
file 驱动下,runtime/cache/ 下的子目录(如 user/、order/)不会被 clear:cache 扫到,得手动删:rm -rf runtime/cache/*/*。
检查路由缓存是否独立存在
TP6 的路由缓存和数据缓存完全分离,哪怕你清了 cache,route 缓存仍可能生效。执行 php think route:cache --annotation 后,务必先清空 runtime/route/ 目录,否则旧 route.php 文件会被继续加载。
关键验证点:在控制器里加 dump(\think\App::debug());,输出 true 表示 APP_DEBUG 仍开启 → 路由缓存根本不会启用,你看到的“旧数据”其实是每次重新解析路由+执行逻辑的结果,不是缓存问题。
排查模型查询缓存是否被忽略
方法一:检查代码中是否用了 cache() 链式调用
Db::table('user')->where('id', 1)->cache(3600)->find() 这类写法才触发查询缓存;Model::find(1) 默认不走缓存,必须显式加 ->cache()。
方法二:在查询后立刻读取缓存值验证
执行 $data = Db::table('user')->cache('test_key', 60)->find(1); 然后立即 dump(\think\facade\Cache::get('test_key')); 如果值为空或与 $data 不一致,说明缓存没写入成功——大概率是 runtime/cache/ 权限不足或驱动配置错误。
方法三:闭包缓存漏 return 是高频陷阱
Cache::remember('user_list', 300, function () { User::where('status', 1)->select(); }); 少了 return,闭包返回 null,缓存就存了 null 并长期生效。
定位模板或响应内容是否被代理缓存
第一步:curl -I http://your-api.com/user/1 查看响应头,重点找 X-Cache、Age、Cache-Control 字段。如果 Age > 0 或命中 CDN/反向代理缓存,清 PHP 层缓存毫无意义。
第二步:临时关闭 Nginx FastCGI 缓存或 Cloudflare 代理,用 curl -H "Cache-Control: no-cache" http://your-api.com/user/1 直接测源站响应。
第三步:确认接口是否用了 Response::cache() 设置了 HTTP 缓存头,该设置独立于 ThinkPHP 内部缓存,需手动移除或调整 max-age。
验证标签缓存是否遗漏清理
① 检查代码中是否有 Cache::tag('user')->set('profile', $data, 3600) 这类带 tag 的写入;
② 若有,cache(null) 或 php think clear:cache 完全无效;
③ 必须执行:use think\facade\Cache; Cache::tag('user')->clear();
注意:只有 file 和 redis 驱动支持 tag,apc、xcache 不支持,但配置里若误设为 apc,tag 方法会静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











