thinkphp8.0升级后缓存清理需分层处理:php think clear --all仅清驱动级缓存,模板缓存须加-t参数,路由缓存须单独执行php think clear:route;模型查询缓存需调db::clearcache(),字段结构缓存须手动删runtime/schema/,自定义store须显式调用cache::store('name')->clear()。

ThinkPHP升级到8.0后缓存清理方式确实变了——命令行为、默认清理范围、模型层与标签缓存的处理逻辑全部重构,沿用TP6/TP7的php think clear或Cache::clear()会漏掉关键缓存项,导致清完仍有旧数据。
命令行清理行为变化
第一步:执行php think clear --all不再等同于“清空所有”。该命令在TP8.0中仅清除驱动级缓存(如runtime/cache/下的文件、Redis中带think_cache:前缀的key),【不清理模型查询缓存、模板编译缓存、字段结构缓存】。
第二步:模板缓存必须显式加-t参数——php think clear --all -t才清runtime/view/;漏掉-t,改了模板也看不到效果。
第三步:路由缓存独立拆出,必须单独执行php think clear:route,否则新路由规则不生效。这个命令在TP7中还不存在,TP8新增且强制要求。
代码中Cache::clear()失效原因
方法一:直接调Cache::clear()在控制器里没反应,大概率是因为当前生效的缓存驱动不是配置里的default,而是被.env覆盖了store名——比如配置里写的是redis,但.env里CACHE_STORE=file,结果你清的是文件目录,而实际数据全在Redis里。
方法二:显式指定驱动名才能清准,例如Cache::store('redis')->clear()。这步不能省,TP8的容器初始化逻辑变了,不显式声明store,Cache::clear()可能fallback到Null驱动,返回true但什么都没删。
注意:如果用了自定义store实例(如Cache::store('my_redis')),Cache::clear()完全不触发它,必须手动调Cache::store('my_redis')->clear()。
模型查询缓存和字段结构缓存必须手动处理
模型层缓存(如UserModel::where()->cache(true)->select()生成的缓存)完全脱离Cache门面管理,TP8不提供一键清除接口。必须进入模型类,调用Db::clearCache()——这一步漏掉,数据库查出来的永远是旧数据。
字段结构缓存存在runtime/schema/或runtime/temp/下,和表结构变更强相关。升级8.0后若修改过数据库字段,不手动删runtime/schema/对应文件,模型会按旧结构解析字段,导致getAttr失败或字段值为空。
这一步操作起来很简单,直接进项目根目录执行:rm -rf runtime/schema/*。但别用php think clear --all替代——它根本不碰schema目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











