ThinkPHP 5.0 缓存清理后仍显示旧内容,主因是缓存多层级(数据/模板/请求/OPcache)相互独立,清A处不等于清B处;须先用config('cache')确认驱动与路径,再分别清理runtime/cache、runtime/template、runtime/request_cache及OPcache。

ThinkPHP 5.0 缓存清理后“还是旧内容”,不是因为没清干净,而是你可能清了A处,但程序读的是B处——缓存有多个层级、多种类型、不同路径,各自独立生效。关键得先定位它到底从哪读的。
一、确认当前实际生效的缓存驱动和路径
别只看配置文件写了什么,运行时可能已降级或被覆盖:
- 执行 var_dump(config('cache')); 查看最终加载的缓存配置,重点看
type(如 file/redis)、path(文件驱动路径)和prefix(前缀是否导致隔离) - 若用文件驱动,检查 runtime/cache/ 是否真被清理;但注意:TP5.0 的
Cache::clear()默认只删该目录下的.php文件,不会进子目录(比如你用cache('user:123:profile'),实际文件可能在runtime/cache/user/123/profile.php,它就逃过清理) - 如果配置了自定义缓存前缀(如
'prefix' => 'api_v2_'),Cache::clear()不识别前缀,需手动匹配删除:find runtime/cache -name "api_v2_*.php" -delete
二、检查是不是模板缓存或请求缓存在作怪
很多人只清了数据缓存,却忘了 TP5.0 还有两层“隐形缓存”:
-
模板缓存:存在
runtime/template/,改了模板不生效?直接删整个目录或调用think template:clear命令 -
请求缓存(静态HTML缓存):存在
runtime/request_cache/,由路由->cache(3600)触发。它和Cache类完全无关,清Cache::clear()对它无效,必须删runtime/request_cache/或用php think clear:request - 验证是否命中请求缓存:访问页面时加一个无意义参数(如
?t=123),若内容变了,说明原请求走的是 request_cache
三、排查 PHP 源码级缓存干扰
代码改了但页面不变?可能是 opcode 缓存没清:
立即学习“PHP免费学习笔记(深入)”;
- 运行
phpinfo(),搜索 OPcache,确认是否启用 - 若启用,临时执行
opcache_reset()(可写个clear_opcache.php脚本访问触发) - PHP 8.1+ 下还要注意:OPcache 若未排除
runtime/目录,会缓存编译后的模板文件,导致权限或哈希异常;建议在php.ini中加opcache.file_exclude=".*runtime.*"
四、验证缓存是否真的“没更新”,而不是“没写入”
很多所谓“清完不生效”,其实是根本没成功写入新值:
- 调试时别猜,直接读:
dump(cache('your_key', 'default'));看输出值,比怀疑框架更可靠 - 闭包写缓存时漏
return?例如cache('key', function() { $data = db()->find(); /* 忘了 return $data; */ });→ 返回null,缓存写入失败,下次仍读旧值 - 缓存路径不可写?检查
runtime/cache/目录权限,Web 进程(如 www-data)必须有写权限;静默失败时,cache()读的永远是上一次成功的旧文件



















