thinkphp缓存清理后页面仍显示旧数据,需逐层排查:先设config/cache.php中'default'=>'null'临时禁用缓存确认问题;再针对性清模板缓存(php think clear -t)、模型查询缓存(cache::clear('query'))、字段结构缓存(db::clearcache())、redis标签缓存(检查tag_prefix并手动兜底),最后排查浏览器及opcache、web服务器缓存。

ThinkPHP缓存清理后页面仍显示旧数据,不是命令没执行成功,而是你只清了表面一层——模板编译缓存、模型查询缓存、字段结构缓存、Redis标签索引、甚至浏览器层的304响应都可能还在生效,必须逐层排查并针对性清除。
先绕过缓存确认是不是它的问题
临时禁用整个缓存系统,比反复清理更可靠:打开config/cache.php,把'default' => 'null',保存后重启服务(或重载FPM);如果页面立刻变新,说明确实是缓存链某环没清干净。
这一步能快速锁定问题范围,避免在runtime目录里盲目删文件。
模板缓存没清干净
php think clear 默认不碰 runtime/view/,而模板修改后页面不变,八成卡在这里。
方法一:强制清模板缓存
执行命令:php think clear -t。TP6.1+ 支持该参数,会精准删除 runtime/view/ 下所有编译文件。
方法二:手动删目录(开发环境推荐)
Linux/macOS下运行:rm -rf runtime/view/;Windows CMD下运行:rd /s /q runtime\view。【别只删 runtime/view/*.php —— 模板按路径哈希分目录,通配符根本扫不到深层文件】
方法三:开发时彻底关掉模板缓存
在 config/template.php 中设 'cache' => false,或设 'cache_time' => 0 强制每次检查源文件时间戳。
模型查询缓存还在生效
Db::where()->cache(true)->select() 生成的缓存键不走全局 prefix,也不进标签系统,php think clear --all 完全不清理它。
第一步:确认是否用了模型缓存
搜索代码中是否有 ->cache(true)、->cache(3600) 或 Cache::remember() 调用。
第二步:针对性清除
直接调用 \think\facade\Cache::clear('query');(TP6.0+),或手动删 runtime/cache/query/ 目录(TP5.1~TP6.0)。
第三步:临时禁用单次查询缓存
调试时在语句末尾加 ->cache(false),比如:Db::name('user')->where('id', 1)->cache(false)->find();
字段结构缓存未更新
新增数据库字段后查不到,大概率是字段缓存没刷新——它存在 runtime/schema/ 或 runtime/temp/,和普通缓存完全隔离。
执行命令:php think clear 会顺带清掉 schema 缓存,但更稳妥的是显式调用:\think\facade\Db::clearCache();
开发阶段建议直接关闭字段缓存:在 config/database.php 中设置 'fields_cache' => false,避免每次改表都要手动清。
Redis 驱动下的标签缓存失效
Cache::tag('user')->clear() 没反应?不是代码错,是底层没穿透。
方法一:确认驱动支持标签
只有 file、redis、memcached 实现了完整标签清理;apcu 和 wincache 调了也白调。
方法二:检查 tag_prefix 配置
Redis 下必须在 config/cache.php 的 redis store 中设 'tag_prefix' => 'tp_tag:',否则索引 key(如 tp_tag:user)和实际数据 key 对不上。
方法三:手动兜底清理(仅限 Redis)
用 redis-cli 执行:scan 0 match tp_tag:user:* count 1000 获取所有关联 key,再对每个 key 执行 sMembers 查出真实缓存键,逐个 del,最后 del tp_tag:user 删除索引本身。【严禁用 keys tp_tag:user:* —— 线上会阻塞】
浏览器和 Web 服务器也在缓存
清完 PHP 层所有缓存,页面还是旧的?可能是 Nginx/Apache 返回了 304,或者 PHP 的 opcache 缓存了已编译的 runtime/view/*.php 文件。
临时禁用 opcache:在 php.ini 中设 opcache.enable=0,然后重启 PHP-FPM。
强制浏览器重新请求:访问 URL 后加随机参数,比如 /index?_t=123456;或在控制器开头加响应头:header('Cache-Control: no-cache, must-revalidate');
清 Nginx 缓存(若启用):执行 rm -f /var/cache/nginx/* 或发送 proxy_cache_bypass 请求头绕过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











