ThinkPHP6升级后需彻底清除TP5残留缓存,包括手动删除runtime/appname/、common/、data/等目录及temp/编译文件,清理Redis中think:*前缀键,并验证缓存路径与读写功能正常。

ThinkPHP6框架更新后,旧版本缓存残留常导致模板不渲染、路由404、配置加载为空等异常,根本原因是TP5与TP6的缓存路径、驱动机制、标签处理逻辑不兼容,旧缓存文件未被新版本识别却仍被系统尝试读取。
确认残留缓存类型和位置
先执行php think version确认当前确实是TP6,再检查config/cache.php中default驱动及stores配置——若仍沿用TP5习惯将path设为../runtime/cache/,而TP6默认使用runtime/cache/,就会出现两套缓存并存;【务必运行php think cache:info(TP6.1+)或var_dump(config('cache'))验证实际生效路径】。
TP5遗留的典型残留目录包括:runtime/appname/(多应用模式下)、runtime/common/(旧版公共缓存)、runtime/data/(TP5自定义数据缓存区),这些目录TP6默认不扫描也不清理。
分层清除TP5残留缓存
第一步:清空TP6已接管的缓存子目录
立即学习“PHP免费学习笔记(深入)”;
执行php think clear --all——该命令仅清TP6容器注册过的cache/、log/、session/、trace/、view/、route/,但【不会触碰TP5遗留的runtime/appname/或runtime/common/】。
第二步:手动删除TP5专属残留目录
在项目根目录执行:rm -rf runtime/appname/* runtime/common/* runtime/data/*;Linux下若提示Permission denied,说明这些目录由旧Web进程创建,需切换到对应用户(如www-data)执行,或加sudo(生产环境慎用)。
第三步:清理可能混存的模板编译文件
TP5的runtime/temp/与TP6的runtime/temp/结构不同,TP6不会覆盖旧编译文件;直接删光:rm -rf runtime/temp/*,TP6会在下次请求时重建符合当前版本规范的编译结构。
清理Redis等外部缓存中的TP5键值
方法一:按前缀安全清理
TP5默认Redis前缀是think:,TP6改为think_cache:;用Redis CLI执行:redis-cli --scan --pattern "think:*" | xargs redis-cli del,避免误删其他业务键。
方法二:代码级精准清除(推荐)
在TP6命令行类中写入:
use think\facade\Cache;<br>Cache::store('redis')->handler()->eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))", [], ['think:*']);
这行Lua脚本原子性执行,比FLUSHDB更安全——它只删匹配前缀的键,不碰think_cache:或其他业务前缀。
注意:若TP5曾用过cache('key', $val, ['tag' => 'user']),其Redis键格式为think:tag:user,上述命令会一并清除,无需额外操作。
验证是否彻底清除
① 检查runtime/下只剩TP6标准子目录:cache/、log/、session/、trace/、view/、route/、temp/,且各目录内无.php以外的可疑文件(如TP5生成的.html缓存)。
② 访问首页后立即执行ls -la runtime/cache/,确认新生成的缓存文件mtime是当前时间,而非几天前的旧时间戳。
③ 在控制器中调用Cache::has('test_key')返回false,再执行Cache::set('test_key', 'v6', 3600),接着Cache::get('test_key')能正确返回'v6',证明缓存驱动已完全切换至TP6实例。



















