php think clear --all 仅清驱动级缓存,不清理模型查询缓存、模板缓存(需-t)、字段结构缓存(需Db::clearCache)、自定义store及标签缓存(依赖驱动支持)。

直接删 runtime/cache/ 不一定清得干净,尤其用了 Redis 或标签缓存时;tp 命令行默认也不清模型查询缓存和模板缓存——得看清楚你到底要清什么。
php think clear --all 为什么还是有旧数据?
因为 php think clear --all 只清「驱动级缓存」(如 runtime/cache/、Redis 中带 prefix 的 key),但以下几类完全不碰:
- 模型层的查询缓存(
UserModel::where()->cache(true)->select()生成的 key 不进标签系统,也不走默认 prefix) - 模板编译缓存(路径在
runtime/view/,必须加-t参数) - 字段结构缓存(存于
runtime/schema/或runtime/temp/,需手动调\think\facade\Db::clearCache()) - 自定义 store 实例(比如
Cache::store('my_redis'),除非显式调用->clear())
Cache::clear() 在控制器里没反应?先查这三件事
常见原因不是代码写错,而是运行时环境没对上:
- 确认当前生效的缓存配置:检查
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() 没用?
这不是 API 调用问题,是底层驱动没真正穿透:
立即学习“PHP免费学习笔记(深入)”;
- 确认驱动支持标签:只有
file、redis、memcached实现了完整标签清理;apc、wincache调了也白调 - 检查
tag_prefix配置:Redis 下必须设'tag_prefix' => 'tp_tag:',否则索引 key 和实际数据 key 对不上 - 手动兜底(Redis 场景):用
scan查tp_tag:user:*,再逐个取sMembers删真实 key,最后删索引本身——别用keys,线上会卡住
线上不敢动 cache/ 目录?换种方式验证是不是缓存惹的祸
最安全的办法不是“清”,而是“绕过”:
- 临时把
config/cache.php里的default改成'null',重启服务,看异常是否消失 - 如果用了 Redis,可临时改
host为一个无效地址,让缓存自动降级,比删目录风险低得多 - 改完立刻测接口,别等缓存自然过期——有些业务缓存有效期设的是 7 天
标签清理和模型缓存清理是两套逻辑,混着清容易漏关键点;TP8 的 Cache::clear() 默认不触发模型层的 key 重建,这点最容易被当成“清失败”。



















