ThinkPHP升级后缓存清不掉,因TP6+模板/路由/Schema缓存路径与机制变更,旧命令不兼容;需用php think clear -t(TP6+)、php think clear --schema或手动删runtime/view/、runtime/schema/等目录,并验证Redis残留key及配置一致性。

ThinkPHP升级后缓存清不掉,常见于新旧版本缓存机制不兼容:TP6+默认启用模板编译缓存且路由缓存写入方式变更,而旧版清理命令未适配新路径;同时升级常伴随.env中CACHE_PATH被覆盖、Redis前缀未同步更新、多级缓存(schema/、view/、route.php)残留导致页面仍加载旧逻辑。
确认是否真没清掉
执行php think clear --all后,立刻验证真实状态:用redis-cli -h 127.0.0.1 keys "think_cache:*"查Redis是否有残留key;或直接ls -l runtime/view/看是否存在编译后的xxx_index.html.php文件——【只要该文件存在,模板就一定不会重新解析】。
别信命令返回“success”,有些驱动clear()返回true但底层unlink失败也不报错。
TP5.1升级到TP6/8后模板缓存清不掉
方法一:强制清理模板缓存目录
执行php think clear -t。TP5.1无此参数,TP6+才支持,它会定位config/template.php中cache_path配置的路径并清空,若该配置被.env覆盖成/tmp/my_view,则-t仍会漏删。
方法二:手动删除runtime/view/全目录
这一步操作起来很简单,直接rm -rf runtime/view/*即可。注意别删runtime/view本身目录,只清内容,否则首次访问会因目录不存在而报错。
方法三:临时关闭模板缓存
在config/template.php中设'cache_on' => false,重启服务立即生效。这不是清理,但能快速验证是否为模板缓存导致的问题。
字段结构缓存(schema)残留导致DB查询异常
第一步:确认当前字段缓存路径
TP6+默认将表结构缓存写入runtime/schema/,而TP5.1写在runtime/temp/;升级后旧缓存文件可能仍在原处未被新版本读取,但框架仍会优先加载runtime/schema/下的新缓存。
第二步:清除schema缓存
执行php think clear --schema(TP6.3+支持),或手动删除runtime/schema/下对应数据表的PHP文件,例如user.php、order.php。
第三步:强制刷新字段缓存
在控制器中调用\think\facade\Db::clearCache(),该方法会清空内存+文件双层缓存,比删目录更彻底。
Redis缓存清不掉的隐蔽原因
方法一:检查Redis连接配置是否被覆盖
查看.env中REDIS_HOST、REDIS_PORT、REDIS_DATABASE是否与config/cache.php中stores.redis.host等一致。升级后常见问题:.env里写的是REDIS_HOST=10.0.1.5,但config/cache.php中仍为127.0.0.1,导致php think clear连错实例,删的根本不是线上缓存。
方法二:确认tag_prefix是否启用
服务器上若开启标签缓存但未配置'tag_prefix' => 'tp_tag:',Cache::tag('user')->clear()只会删索引,真实key(如think_cache:xxx)还在Redis里躺着——这一步必须配,不配等于白清。
方法三:用Redis CLI直连验证是否写入成功
执行redis-cli -h 127.0.0.1 keys "think_cache:*",如果返回空,说明缓存根本没进Redis,问题出在驱动未初始化,不是清理动作失效。
路由缓存无法加载新规则
① 执行php think route:clear
TP6+新增该命令,专清runtime/route.php。TP5.1没有这个命令,必须手动rm -f runtime/route.php,否则新定义的Route::rule()永远不会加载。
② 检查config/route.php中是否启用路由缓存
若设置'route_cache' => true,但runtime/route.php被误删后未重建,首次访问会卡住或404;此时需临时设为false,访问一次触发重建,再改回true。
③ 避免用php think clear --all连带清掉配置缓存
该命令会清runtime/config/,导致数据库host、app_debug等配置变null。应改用php think clear -f仅清文件缓存,或明确指定--except=config。



















