必须区分驱动类型清理,因文件缓存存于runtime/cache/、redis缓存存于redis且带prefix,混用命令易漏清或引发线上异常;需先查config/cache.php中default值确认驱动,再分别执行php think clear:cache或redis-cli scan del前缀key,并对标签缓存单独调用cache::tag('x')->clear()。

清理ThinkPHP文件缓存和Redis缓存必须区分驱动类型,因为两种缓存存储位置、清理机制、安全边界完全不同;直接用同一套命令或代码清理,大概率只清掉其中一种,甚至触发线上服务异常。
确认当前缓存驱动类型
打开项目根目录下的 config/cache.php,找到 'default' => 'xxx' 配置项:
若值为 'file',则主缓存走文件系统;
若值为 'redis' 或自定义store名(如 'my_redis'),则主缓存走Redis;
【必须先看这个,否则后续所有操作都可能白做】
同时检查 stores 数组中对应驱动的配置:file驱动关注 'path' 路径是否被 .env 中的 CACHE_PATH 覆盖;redis驱动重点核对 'host'、'database' 和 'prefix' 是否与生产环境一致。
清理文件缓存(file驱动)
方法一:命令行一键清理(推荐开发/测试环境)
在项目根目录执行:php think clear:cache
该命令只清 runtime/cache/ 及其子目录(含多应用模式下的 runtime/appname/cache/),不碰 log/、temp/、route/ 等其他运行时目录。
方法二:手动删除(谨慎用于线上)
Linux/macOS下执行:rm -rf runtime/cache/*
注意:不要用 rm -rf runtime/cache(会删掉目录本身),也不要执行 rm -rf runtime/*(会误删日志和模板缓存)。删完后访问任意接口,框架会自动重建 cache/ 目录结构。
方法三:代码内清除(适用于控制器或调试页)
在任意PHP文件中写:
use think\facade\Cache;<br>Cache::store('file')->clear();
这比
Cache::clear() 更可靠——后者依赖容器自动解析默认store,而线上环境有时因配置加载顺序问题会 fallback 到 null 驱动,导致看似成功实则没删。
清理Redis缓存(redis驱动)
第一步:确认Redis前缀
查看 config/cache.php 中 redis store 的 'prefix' 值,例如 'think_cache:'。ThinkPHP 所有缓存key都会自动加此前缀,如 think_cache:user:123。
第二步:安全清理(避免误删其他业务数据)
不要执行 FLUSHDB 或 FLUSHALL —— 这会清空整个Redis库,可能连session、队列、分布式锁全干掉。
正确做法是用scan指令按前缀精准匹配:redis-cli -h {host} -p {port} -a {password} --scan --pattern "think_cache:*" | xargs -r redis-cli -h {host} -p {port} -a {password} del
其中 {host}、{port}、{password} 替换为实际配置值。
第三步:验证是否清理干净
随便选一个已知存在的缓存key(如 think_cache:config),执行:redis-cli -h {host} -p {port} -a {password} exists "think_cache:config"
返回 (integer) 0 表示删除成功;若返回 1,说明前缀配置不一致或Redis连接到了错误实例。
标签缓存(tag)必须单独处理
无论你用的是file还是redis驱动,只要用了 Cache::tag('user')->set(),普通清理方式完全无效。
必须显式调用标签清除接口:Cache::tag('user')->clear();
注意:apc、xcache等驱动不支持tag,调了也没反应;redis驱动下还需确保配置里启用了 'tag_prefix'(如 'tp_tag:'),否则索引key和真实key无法关联。
如果要清多个标签,可传数组:Cache::tag(['user', 'order'])->clear();
这会清掉同时打上这两个标签的缓存项;任意一个标签被清,该缓存即失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











