ThinkPHP 8.1 缓存需精准清理:php think clear --all仅清驱动级缓存,不清理模型查询缓存(需Db::clearCache())、模板编译缓存(需-t参数)、字段结构缓存(需Db::clearCache())及自定义store缓存。

有,但“快捷”不等于“一键全清”。ThinkPHP 8.1 的缓存是分层、分驱动、分用途的,高手不会盲目执行 php think clear --all,而是按需精准清理——既快又稳,还能避开线上事故。
看清缓存类型再动手
TP8.1 默认的 php think clear --all 只清「驱动级缓存」:比如 runtime/cache/ 下的文件,或 Redis 中带 cache_prefix 的 key。但它完全不碰以下几类:
-
模型查询缓存:如
UserModel::where()->cache(true)->select()生成的缓存,key 不走统一前缀,得靠Db::clearCache()或手动删对应 key -
模板编译缓存:存在
runtime/view/,必须加-t参数:php think clear -t -
字段结构缓存:存于
runtime/schema/或runtime/temp/,需显式调用\think\facade\Db::clearCache() -
自定义 store 缓存:比如
Cache::store('my_redis'),--all不会自动清理,得自己写->clear()
高手常用三招组合拳
不是靠一个命令,而是用三个命令快速覆盖高频场景:
-
php think clear --all→ 清基础驱动缓存(file/redis) -
php think clear -t→ 强制重编译所有模板,解决页面样式/逻辑不更新 -
php think config:clear && php think config:cache→ 专治 config() 返回旧值(尤其改了.env或config/app.php后)
顺手加个 && \think\facade\Db::clearCache() 在控制器里跑一次,就能把字段缓存也带上——比删 runtime/schema/ 更可靠。
立即学习“PHP免费学习笔记(深入)”;
Redis 场景下标签缓存要手动兜底
用 Cache::tag('user')->clear() 在 Redis 下可能无效,原因很实在:
- 没配
tag_prefix(如'tag_prefix' => 'tp_tag:'),索引 key 和真实 key 对不上 - 驱动不支持完整标签清理(apc/wincache 就不行,file/redis/memcached 才行)
- 动态标签如
Cache::tag('user_'.$uid),->clear()只清单个,批量清理得用 scan:
示例(Redis CLI 或命令行脚本中):
redis-cli --scan --pattern "tp_tag:user_*" | xargs -r redis-cli del
注意:别用 KEYS tp_tag:user_*,线上大库会阻塞服务。
线上不敢动?绕过比清除更安全
真正高手在线上第一反应不是“怎么清”,而是“怎么验证是不是缓存导致的”:
- 临时把
config/cache.php中的'default' => 'null',重启服务,看问题是否消失 - Redis 环境可临时改
host为一个不可达地址(如127.0.0.9),让缓存自动降级,不影响业务 - 模板问题?加参数
?v==time()?>强制绕过浏览器和框架缓存,快速定位
确认是缓存惹的祸,再清理;否则白忙活还可能误删关键数据。



















