ThinkPHP6一键清所有缓存需分层验证:先查config/cache.php和php think cache:status确认驱动及路径;file驱动用php think clear --all,redis驱动用php think cache:clear --type=redis避免FLUSHDB误删,混合驱动需两者并行,标签缓存须Cache::tag('xxx')->clear()单独处理,最后通过clear_all.php脚本安全执行。

ThinkPHP6项目上线后缓存类型混杂,file驱动存runtime/cache/、Redis存键值对、模板缓存独立在runtime/view/、路由缓存固化为runtime/route.php——用一键脚本清所有缓存,稍有不慎就会删掉正在写的日志、清空Redis里其他业务数据、或让首页直接404,必须分层验证再执行。
先确认当前缓存驱动和实际路径
打开项目根目录下的config/cache.php,找到'default'配置项,记下它的值(比如'redis'或'file');再检查该驱动对应的'stores'配置里path字段是否被修改过,【若path指向非runtime/cache/的自定义路径,后续所有命令都得显式指定store名】。
运行php think cache:status,观察输出中driver和path两行内容,比对config/cache.php是否一致——不一致说明环境变量覆盖了配置,得去.env里查CACHE_DRIVER和CACHE_PATH。
按驱动类型选择清理方式
方法一:file驱动(默认但生产环境少用)
立即学习“PHP免费学习笔记(深入)”;
执行php think clear --all,它会删runtime/下所有子目录,包括cache/、log/、view/、route/、temp/;这一步能清掉模板和路由缓存,但【删完立刻访问首页报404,大概率是route.php被删导致路由未加载,需手动补php think route:build】。
方法二:redis驱动(生产环境主流)
先用redis-cli -a your_password info | grep dbSize确认当前DB数据量;再执行php think cache:clear --type=redis,它只清前缀为think_cache:*的键,不会FLUSHDB;如果项目共用Redis实例,【千万别手敲FLUSHDB,否则订单、用户会话全丢】。
方法三:混合驱动(file+redis同时启用)
php think clear --all只清runtime/文件,对Redis无影响;必须额外跑php think cache:clear --type=redis;若用了Cache::store('my_redis')这种自定义store,还得单独调Cache::store('my_redis')->clear()。
标签缓存必须单独处理
第一步:检查代码里有没有Cache::tag('user')->set()这类写法,grep -r "Cache::tag" app/能快速定位。
第二步:按标签名逐个清除,例如Cache::tag('user')->clear();tp6.1+支持多标签绑定,但清除时只要命中任一标签就失效,所以Cache::tag(['user','v2'])->clear()等价于分别清两个标签。
第三步:验证是否清干净,用Cache::tag('user')->get('profile')返回null才算成功;注意apc/xcache驱动不支持标签,这段代码在它们上面会直接报错。
安全执行一键脚本的临界操作
在项目根目录新建clear_all.php,内容如下:
<?php
require 'vendor/autoload.php';
use think\facade\Cache;
use think\helper\Dir;
use think\facade\Env;
// 1. 清文件缓存子目录
Dir::delete(Env::get('runtime_path') . 'cache');
Dir::delete(Env::get('runtime_path') . 'view');
unlink(Env::get('runtime_path') . 'route.php');
// 2. 清Redis(仅当配置为redis且扩展可用)
if (Cache::getDriver()->getName() === 'redis') {
Cache::store('redis')->clear();
}
// 3. 清标签缓存(按需取消注释)
// Cache::tag('user')->clear();
?>
保存后执行php clear_all.php;【执行前务必确保没有其他请求正在写入runtime/目录,否则可能删到一半被中断】。



















