缓存清理后没生效,通常因未清到真正起作用的目录(如runtime/view/、temp/、schema/),或命令覆盖不全、权限不一致、标签名大小写错误、闭包漏return、值相等跳过写入等导致。

缓存清理后没生效,通常不是命令没跑,而是没清到真正起作用的地方,或者旧缓存还在被悄悄加载。
删错了目录:runtime 下有多个缓存层
ThinkPHP 5.1 的缓存不是只存在一个地方。光删 runtime/cache/ 是不够的:
- 模板编译缓存 在 runtime/view/(页面没变、标签失效,大概率是它)
- 配置与模板解析中间缓存 在 runtime/temp/(升级后标签报错、{if}不闭合等,常因它残留)
- 字段结构缓存 可能在 runtime/schema/ 或 runtime/temp/ 里(改了数据库字段但模型读不到新字段)
-
Cache::tag() 标签映射文件 是独立生成的,和主缓存文件不在同一级目录,
Cache::clear()可能漏掉
清理方式不对:命令或代码没覆盖全
这些操作看似在清缓存,实际效果有限:
-
php think clear默认只清 cache/ 和 log/,不碰 view/ 和 temp/ -
Cache::clear('cache')清的是数据缓存,对模板、编译、字段缓存完全无效 - 手动删 runtime/cache/* 但忘了 runtime/cache/ 下还有子目录(如按标签分的 user/、order/),文件根本没删干净
- 用
cache('key', null)想删单个键,但在 TP5.1+ 中应写成cache('key', '', 0),传null可能被忽略
权限与环境干扰:删了也白删
你以为删掉了,其实 PHP 写不进、读不出,或读的是别的副本:
- Web 服务器(如 nginx)运行用户和 CLI 执行用户不一致,删完 runtime 后,Web 进程因权限不足无法重建缓存,仍加载旧文件
- 用了自定义缓存前缀(如
'prefix' => 'admin_v2_'),Cache::clear()不识别前缀,得手动匹配文件名清理 - Redis 驱动下执行
Cache::clear(),若共用 DB,会清空整个 Redis 实例,导致其它服务缓存丢失——这不是没生效,是“过度生效”了 - 模板缓存设了
'cache_time' => 3600,但源文件修改时间没变,ThinkPHP 就不会重编译,删了 view 目录后首次访问才重建
缓存根本没被触发更新
你以为“改了数据 → 缓存该变”,但框架压根没走写入流程:
- 闭包回调里漏写
return,cache('key', function(){ $data = db()->select(); })不返回值,缓存就一直用旧副本 - 新值和旧值
===相等(比如都是null或相同数组),TP5.0–5.1 会跳过写入,缓存看起来“卡住”了 - 用了
cache('key', $val)但缓存路径不可写(runtime/cache/ 权限为只读),写操作静默失败,读的还是上一次成功的旧文件 - 标签清除写成
Cache::tag('User')->clear(),但标签名必须全小写且无特殊字符,'User'≠'user',实际一条都没删掉
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











