ThinkPHP6迁移TP5缓存需重写config/cache.php配置,统一小写驱动名、使用think-redis扩展、修正env键名、显式配置serialize、手动处理prefix。

在ThinkPHP6项目中迁移原有TP5缓存逻辑时,常因配置结构、驱动类路径、环境加载机制差异导致缓存失效或报错,必须逐项核对并重写关键配置段。
缓存配置文件位置与结构彻底变更
TP5的缓存配置集中在config.php中一个数组里,而TP6已拆分为独立的config/cache.php文件;直接复制TP5配置到TP6的config.php根目录下会完全被忽略。
打开config/cache.php,确认返回的是标准数组结构,不是TP5风格的单层return ['type'=>'file', 'path'=>'runtime/cache']——TP6要求必须包含'default'键和'stores'嵌套数组。
【'stores.redis.type' => 'redis'必须小写,写成'Redis'或'REDIS'会导致Driver not supported错误】
立即学习“PHP免费学习笔记(深入)”;
Redis驱动类路径不兼容
方法一:TP5中可直接写'type' => 'redis',TP6必须明确指定完整命名空间或使用官方适配器:
'type' => '\think\cache\driver\Redis'(需确保该类存在)
方法二:更稳妥的方式是使用TP6官方推荐的topthink/think-redis扩展包提供的驱动:
'type' => 'redis' → 此时框架会自动匹配think\cache\driver\Redis,但前提是已执行composer require topthink/think-redis,否则报错且无提示。
注意:TP5常用predis或phpredis原生扩展,TP6不兼容这些裸驱动——必须通过think-redis桥接层注册,否则Cache::store('redis')会静默失败。
环境变量加载时机不同导致配置覆盖
第一步:TP5读取.env在应用初始化早期,TP6则在配置加载阶段才解析.env;若你在TP5中用env('CACHE_DRIVER', 'file')动态设default,在TP6中必须改写为:
'default' => env('cache.driver', 'file'),(注意key为cache.driver,不是CACHE_DRIVER)
第二步:检查.env中是否写成CACHE_DRIVER=redis——TP6默认读取小写下划线格式cache.driver,大写或中划线均无效。
第三步:TP5允许在控制器里动态调用Cache::connect()切换驱动,TP6已移除此方法;所有驱动必须在config/cache.php中预定义,运行时只能用Cache::store('xxx')选择已声明的store。
序列化机制默认行为变化
TP5的File驱动默认用serialize/unserialize,TP6的File驱动默认序列化方式为空数组'serialize' => [],即不序列化——这意味着TP5缓存的对象在TP6中读取会直接报错。
若需兼容,必须显式补全:'serialize' => ['serialize', 'unserialize'],否则遇到对象或资源类型数据时,Cache::get()返回false或空值。
Redis驱动在TP6中默认使用igbinary(若扩展存在),而TP5默认用phpserialize;跨版本共享Redis数据时,务必统一'serialize' => ['phpserialize', 'unserialize']。
缓存前缀处理逻辑差异
TP5中prefix配置会自动追加到每个key前,TP6的prefix仅作用于store级,且不自动拼接——例如TP5写'prefix' => 'tp5_',key'user_1001'实际存为'tp5_user_1001';TP6需手动在Cache::set('tp5_user_1001', ...)中拼好前缀,或改用Cache::tag('tp5')->set('user_1001', ...)配合tag前缀机制。
TP6的prefix字段只影响底层驱动生成的原始key,不参与Cache门面的key拼接逻辑——这是最易踩坑的一点,旧代码未改前缀就直接升级,会导致缓存命中率归零。



















