php think clear --all 清不干净,因其仅清除驱动级缓存(如 runtime/cache/ 文件及 Redis 中带默认 prefix 的 key),但不处理模型查询缓存、模板编译缓存(需 -t 或 clear:template)、字段结构缓存(需 Db::clearCache())、自定义 store 及标签缓存(依赖驱动支持)。

php think clear --all 为什么清不干净
因为 php think clear --all 只清驱动级缓存(如 runtime/cache/ 下的文件、Redis 中带默认 prefix 的 key),但完全不碰以下几类:
- 模型查询缓存:比如
UserModel::where()->cache(true)->select()生成的缓存 key 不走统一 prefix,也不进标签系统 - 模板编译缓存:存在
runtime/view/,必须加-t或用php think clear:template(TP6.1+ 支持,TP5 没这个命令) - 字段结构缓存:存于
runtime/schema/或runtime/temp/,得手动调\think\facade\Db::clearCache() - 自定义 store 缓存:如
Cache::store('my_redis'),clear()默认不作用于它,除非显式调用->clear()
代码里调 Cache::clear() 没反应?先查这三件事
不是 API 写错了,而是运行时环境没对上:
- 确认当前生效的缓存配置:检查
config/cache.php中default值,以及stores['file']['path']是否被.env覆盖(例如写了CACHE_PATH=/tmp/my_cache却没同步到配置) - 别依赖默认 store:显式指定驱动名,比如
Cache::store('file')->clear(),避免容器未初始化或 fallback 到Null驱动 - 验证是否真删了:执行后立刻跑
var_dump(file_exists(runtime_path() . 'cache/xxx.php'))或 Redis 里exists think_user_123,别只信Cache::clear()返回true
标签缓存清不掉?驱动和配置都得对上
Cache::tag('user')->clear() 失效,通常不是调用问题,而是底层没穿透:
- 确认驱动支持标签:只有
file、redis、memcached实现了完整标签清理;apc、wincache调了也白调 - 检查
tag_prefix配置:Redis 下必须设'tag_prefix' => 'tp_tag:',否则索引 key(如tp_tag:user)和实际数据 key 对不上 - 手动兜底(Redis 场景):用
scan 0 tp_tag:user:* count 1000查索引,再逐个smembers取真实 key,删完再删索引本身——别用keys,线上会卡住
线上不敢删 runtime/?绕过比清除更安全
最稳妥的验证方式不是“清”,而是“绕过”:
- 临时把
config/cache.php里的default改成'null',重启服务,看异常是否消失 - 如果用了 Redis,可临时改
host为一个无效地址(如127.0.0.9),让缓存自动降级,比删目录风险低得多 - 改完立刻测接口,别等缓存自然过期——有些业务缓存有效期设的是 7 天
标签清理和模型缓存清理是两套逻辑,混着清容易漏关键点;TP8 的 Cache::clear() 默认不触发模型层的缓存失效,这点最容易被忽略。

















