thinkphp缓存删不干净的根本原因是清理目标与实际生效缓存错位:默认命令不清理redis前缀key、模型查询缓存、模板缓存(需-t)、路由缓存(需clear:route)、字段结构缓存(需db::clearcache)及自定义store(需显式调用),且cli下驱动可能未初始化。

ThinkPHP项目缓存删不干净,不是命令没敲对,而是你清的压根就不是正在生效的那部分缓存——比如Redis里还躺着带think_cache:前缀的key,runtime/cache/目录却空空如也;又或者Cache::clear()返回true,但模型层的where()->cache(true)->select()结果纹丝不动。
缓存驱动配置与实际清理目标错位
第一步:打开config/cache.php,确认default值是否为'redis'或'memcached';若为file,再检查stores['file']['path']是否被.env中CACHE_PATH覆盖,例如写成CACHE_PATH=/tmp/think_cache却未同步到配置文件——【此时php think clear --all只清runtime/cache/,根本碰不到/tmp/think_cache】。
第二步:执行php think clear --all后,立刻验证真实路径是否存在缓存残留:在控制器里运行var_dump(file_exists(config('cache.stores.file.path') . '/user_123.php')),或用redis-cli连上Redis执行exists think_cache:user_profile。
这一步操作起来很简单,直接把文件拖进去就行。但如果你跳过验证,只信命令返回的“Clear success”,就等于在盲区里清垃圾。
模板缓存、路由缓存、字段结构缓存各自独立
php think clear默认只清runtime/cache/下的驱动级缓存,以下三类完全不处理:
• 模板编译缓存(runtime/view/)→ 必须加-t参数:php think clear -t
• 路由缓存(runtime/cache/route.php或runtime/route.php)→ 必须用php think clear:route或手动rm -f runtime/cache/route.php
• 字段结构缓存(runtime/schema/或runtime/temp/)→ 必须调用\think\facade\Db::clearCache()
注意:TP8中runtime/temp/下不仅存编译模板,还存数据库字段缓存,误删整个temp目录会导致首次访问报“Class not found”或字段类型解析失败。
标签缓存和自定义store需显式清理
方法一:按标签清除
Cache::tag('user')->clear()仅对file和redis驱动有效;apc、wincache调了也白调——先确认config/cache.php中对应驱动的tag_prefix是否配置正确,Redis下必须设'tag_prefix' => 'tp_tag:',否则索引key(tp_tag:user:*)和真实数据key对不上。
方法二:清自定义store实例
如果代码里用了Cache::store('my_redis')->set('key', $val),那么php think clear --all或Cache::clear()完全不会触达它——【必须显式调用Cache::store('my_redis')->clear()】。
方法三:Redis兜底扫描(线上慎用)
当tag清除失效时,用redis-cli执行scan 0 tp_tag:user:* match tp_tag:user:* count 1000 → 取出每个key对应的sMembers → 逐个del真实缓存key → 最后del tp_tag:user:*索引本身;严禁用keys tp_tag:user:*,线上会阻塞。
模型查询缓存游离于全局清理之外
Model::where()->cache(true)->select()生成的缓存key不走默认prefix,也不进标签系统,php think clear --all和Cache::clear()均无法命中。
唯一可靠方式是重启应用进程(如reload PHP-FPM),或临时将APP_DEBUG设为true强制绕过所有模型缓存——因为模型缓存是在SQL执行前硬编码拦截的,不经过Cache门面。
这一步不能靠命令补救,只能靠环境切换或服务重启。
CLI环境缓存驱动未初始化
在命令行执行Cache::clear()时,ThinkPHP容器未必已加载全部缓存驱动,尤其自定义store(如Cache::store('aliyun_oss'))可能根本没注册——此时clear()静默返回true,但什么都没发生。
验证方式:在命令行中执行php -r "var_dump(\think\Container::getInstance()->has('cache.aliyun_oss'));",返回false即表示该驱动未加载。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











