ThinkPHP6上线后缓存残留的根本原因是未按实际缓存驱动类型执行对应清理:file驱动需清runtime//cache/,redis驱动须用KEYS+DEL按前缀清理,标签缓存必须调用Cache::tag('xxx')->clear(),schema字段缓存需删runtime/cache/schema/并重启PHP-FPM或Swoole进程。

ThinkPHP6项目上线后缓存一直残留,导致页面内容不更新、接口返回旧数据、路由跳转404或数据库字段读取失败,根本原因是部署时未按实际缓存驱动类型执行对应清理动作,git clean -fdx 无法触达 runtime 目录,而 php think clear 又可能漏掉标签缓存、Redis前缀缓存或 schema 字段缓存。
确认当前生效的缓存驱动类型
打开 config/cache.php,检查 'default' 配置项值(如 'redis' 或 'file'),再定位到对应的 stores 配置块。若使用环境变量(.env),运行 php think env:show 查看 CACHE_DRIVER 值。【必须先确认驱动类型,否则后续所有清理操作都可能无效】
若配置中 default 是 redis,但实际连接失败降级为 file,需通过 php think tinker 执行 Cache::getStore()->getDriverName() 实时验证真实驱动。
按驱动类型精准清理
方法一:file 驱动(含多应用模式)
立即学习“PHP免费学习笔记(深入)”;
进入项目根目录,执行:
rm -rf runtime/*/cache/* runtime/cache/*
这一步会清空所有应用下的文件缓存,但保留 log/、temp/、route/ 等关键子目录——误删 temp 会导致模板编译失败,报错“Template not found”。
方法二:redis 驱动
先查前缀:在 config/cache.php 的 stores.redis.prefix 中确认值(默认为 think_cache:);再用 redis-cli 连接后执行:
KEYS "think_cache:*" → 检查是否命中业务缓存
DEL $(redis-cli KEYS "think_cache:*")
【严禁直接 FLUSHDB,会误删其他服务共用的 Redis 数据库】
方法三:混合驱动(如 file + redis + tag 缓存)
仅靠命令行无法覆盖全部场景,必须补上标签缓存清除:
php think tinker
> use think\facade\Cache;
> Cache::tag('user')->clear();
> Cache::tag('order')->clear();
标签缓存只存在于 file 和 redis 驱动中,apc 或 xcache 不支持 tag,调用 clear() 会静默失败,无任何提示。
强制刷新数据库字段缓存
第一步:确认 database.php 中 'fields_cache' 配置为 true(生产环境通常开启)
第二步:删除 runtime/cache/schema/ 下全部文件,该目录存储表结构元信息,字段新增后不删此处会导致 Db::name('user')->field('new_col') 报错“Unknown column”
第三步:执行 php think clear -f → 清除文件类缓存,但不碰 Redis 和日志,避免影响监控链路
第四步:重启 PHP-FPM 或 Swoole 进程 → 【重要:Swoole 进程常驻内存,不重启则 schema 缓存永远不更新】
模板与编译缓存专项清理
php think clear 默认不清理 runtime/view/ 下的编译模板文件,上线后修改了 .html 模板却仍显示旧内容,就是这个原因。
加 -t 参数强制清理:
php think clear -t
注意:该参数只清理 ThinkPHP 原生模板引擎路径(由 config/template.php 中 cache_path 决定),若你改过 cache_path 为 /data/tpl_cache,则 -t 不生效,必须手动 rm -rf /data/tpl_cache/*
上线前最终验证步骤
① 访问 /index.php?s=route:list(TP6 路由调试页),确认输出中包含新添加的路由规则
② 在控制器中写一行测试代码:
dump(Cache::store('redis')->get('test_key'));
然后用 redis-cli SET think_cache:test_key "live_check" → 若 dump 返回 null,说明 Redis 缓存通道未通
③ 执行 php think db:query "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='user'" → 对比结果与 runtime/cache/schema/user.php 中字段列表是否一致
④ curl -I https://yourdomain.com/api/v1/user → 检查响应头 X-Powered-By 是否含 ThinkPHP,且状态码为 200



















