ThinkPHP跨版本升级缓存失效是因为6.0+废弃旧门面与驱动注册机制,需改用think\facade\Cache调用、确保driver小写、配置stores.redis完整参数、安装think-redis包并清除runtime缓存验证。

ThinkPHP跨版本升级时缓存驱动失效、读写报错或配置不生效,是因为6.0+废弃了旧版缓存门面与驱动注册机制,且默认不再自动加载自定义驱动类。
确认当前缓存配置位置与格式
打开项目根目录下的config/cache.php文件,检查是否仍沿用TP5.x风格的二维数组结构——例如'driver' => 'redis'、'host' => '127.0.0.1'等键值直接平铺在顶层。TP6.0起该文件必须返回一个关联数组,且【driver字段值必须小写】(如'redis',不能是'Redis'或'REDIS'),否则会触发Driver [Redis] not supported错误。
若你使用的是多缓存连接(如redis+file混合),需确认config/cache.php中是否已定义connections子数组,而非继续写在根级配置里。
替换缓存驱动类引用与实例化方式
方法一:改用facade门面调用(推荐)
将原来控制器或服务中类似$cache = new \think\Cache();或\think\Cache::store('redis')->get('key')的写法,全部替换为\think\facade\Cache::store('redis')->get('key')。TP6+缓存门面已移至think\facade命名空间,直接new Cache类会报Class not found。
立即学习“PHP免费学习笔记(深入)”;
方法二:通过容器获取实例
在需要的地方调用app()->get('cache')获取缓存管理器,再链式调用->store('redis')。注意:不能写app()->cache(),该快捷方法在TP6.3+已被移除。
方法三:手动注册自定义驱动(仅限非标准驱动)
若你曾扩展过Memcached或APCu等非内置驱动,需在app/Providers/AppServiceProvider.php的register()方法中显式绑定:
Cache::extend('apcu', function ($app) { return new \app\cache\ApcuCache($app); });
【extend()必须在应用启动早期执行,不能放在路由或控制器里】
重写Redis/Redis集群驱动配置
第一步:确认vendor/topthink/think-orm包已升级到对应框架版本要求的最低版(TP8需think-orm ^3.0),否则Redis连接池功能不可用。
第二步:进入config/cache.php,将redis连接参数从旧版host/port/db改为DSN格式:
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 3600
],
→ 改为:
'redis' => [
'type' => 'redis',
'dsn' => 'redis://:password@127.0.0.1:6379/0',
'timeout' => 0,
'expire' => 3600
],
第三步:若使用Redis集群,必须删除旧版cluster => true配置项,改用新的clusters配置块,并确保每个节点地址带端口且无协议前缀:
'clusters' => [
'default' => [
'127.0.0.1:7000',
'127.0.0.1:7001',
'127.0.0.1:7002'
]
]
清除旧缓存并验证驱动加载
执行php think clear:cache清空runtime/cache/下所有缓存文件。
运行php think optimize:config生成新的配置缓存,避免因旧缓存残留导致driver未生效。
在任意控制器中写入测试代码:
$result = \think\facade\Cache::store('redis')->set('test_key', 'v8_test', 60);
var_dump(\think\facade\Cache::store('redis')->get('test_key'));
若输出string(8) "v8_test",说明Redis驱动已正确加载。



















