thinkphp项目迁移后路由失效等问题主因是缓存残留,需分层清除:先执行php think clear --all清驱动级缓存,再调用db::clearcache()清模型查询缓存,最后手动删除runtime/view/并执行php think clear:route清模板与路由缓存,同时处理标签索引残留并验证三类缓存是否真正清空。

ThinkPHP项目迁移后旧缓存残留会导致路由失效、模板报错、数据库查询返回旧数据,甚至出现Class not found或配置项丢失等启动级异常——这不是代码问题,而是缓存路径错位、驱动未重载、标签索引未刷新共同造成的。
确认当前实际生效的缓存驱动类型
迁移后最常被忽略的一步:config/cache.php中的default值可能仍指向旧环境配置,而.env文件里的CACHE_DRIVER、REDIS_HOST等变量已变更但未生效。执行php think optimize:config后,必须验证运行时真实加载的驱动。
在任意控制器中插入以下代码并访问接口:
dump(config('cache.default')); dump(Cache::getDriver()::class);
若输出为think\cache\driver\File但项目已切Redis,说明配置未重载——【必须重新执行php think optimize:config并确保CLI与Web环境使用同一.env】。
分层清除三类核心缓存
迁移后残留缓存分属三个独立体系,必须逐层清理,缺一不可:
第一步:清驱动级缓存
执行php think clear --all → 该命令会清理runtime/cache/(file驱动)或Redis中带think_cache:*前缀的key(redis驱动),但仅限默认store。
第二步:清模型查询缓存
模型层缓存(如UserModel::where()->cache(true)->select()生成的key)不走Cache门面,需手动触发:
\think\facade\Db::clearCache();
第三步:清模板与路由编译缓存
runtime/view/和runtime/route.php是独立路径,php think clear --all默认不碰它们:
rm -f runtime/view/* && php think clear:route
处理标签缓存残留
若迁移前大量使用Cache::tag('user')->set(),旧标签索引可能仍存在于Redis中,导致新环境写入同名标签时读取到旧数据。
方法一:按标签精准清除
在控制器中执行:
Cache::tag('user')->clear(); Cache::tag('order')->clear();
方法二:强制重建标签索引(Redis场景)
进入Redis CLI执行:
SCAN 0 MATCH tp_tag:user:* COUNT 1000 → 获取所有匹配key → 对每个key执行SMEMBERS再逐个DEL真实缓存key → 最后DEL tp_tag:user索引本身。
注意:不能用KEYS tp_tag:user:*,线上环境会阻塞。
验证是否真正清空
不要依赖命令返回success就认为完成。迁移后必须做三项硬性验证:
① 检查runtime/cache/下是否还有.php文件(file驱动);
② 在Redis中执行EXISTS think_user_123,确认业务key已消失;
③ 访问一个刚修改过的注解路由接口,用xdebug或dump(\think\Route::rules())确认路由规则已更新而非加载旧缓存。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











