thinkphp6缓存迁移需满足三层校验:驱动显式加载、store精确匹配、键名合规;配置文件拆分为独立cache.php且default字段为开关;redis需手动安装think-redis包;多store必须显式指定;键名须规范并设prefix;传0不再永不过期,需传null。

ThinkPHP5和ThinkPHP6缓存驱动配置不是简单改个文件路径就能迁移的事,TP6把整个缓存体系从“配置即生效”变成了“驱动必须显式加载+store必须精确匹配+键名必须合规”三层校验机制,配错任意一层Cache::get()就静默返回null。
缓存配置文件结构完全不同
TP5的缓存配置全堆在application/config.php里一个大数组中,靠'cache' => ['type'=>'file']这种扁平键控制;TP6则强制拆成独立的config/cache.php文件,且必须明确声明'default' => 'redis',否则即使stores.redis写得再全也压根不生效。
TP6的config/cache.php里'default'字段是开关级配置——它不指代具体连接参数,只决定框架默认走哪个store;而TP5没有store概念,所有缓存操作都直接绑定到type值上。
Redis驱动必须手动安装扩展
方法一:执行命令安装官方适配层
composer require topthink/think-redis
【Driver [redis] not supported错误,90%源于未执行该命令】
TP5内置Redis驱动支持,只要配置好host/port就能用;TP6默认只带file和array驱动,Redis必须装topthink/think-redis这个包——它不是原生predis或phpredis,装错包会导致驱动注册失败且无明确报错。
方法二:确认配置项是否完整
检查config/cache.php中stores.redis.host、port、password是否全部填妥,Docker环境不能写127.0.0.1,得换成host.docker.internal或宿主机真实IP。
多store场景下读写必须显式指定
第一步:配置多个store
在config/cache.php中定义'stores' => ['file' => [...], 'redis' => [...]],并确保'default' => 'file'或'redis'指向其一。
第二步:跨store读写必须带store标识
想往Redis写但default是file?必须用Cache::store('redis')->set('key', $val);如果漏掉store('redis'),框架会fallback到default驱动,数据实际写进runtime/cache/目录却试图从Redis读,必然读不到。
TP5没有store概念,所有缓存操作都走全局配置的type,不存在跨store读写错位问题。
缓存键名合法性要求升级
TP5对键名容忍度高,空格、中文、斜杠都能写进file驱动(虽然可能生成非法文件名);TP6的file驱动遇到含/、..、空格的key会静默失败,且Redis驱动若没设prefix,多个项目共用同一Redis实例时极易键名冲突。
解决办法:统一用md5($key)或规范命名(只含字母、数字、下划线),并在config/cache.php中设置'prefix' => 'tp6_'避免污染。
缓存有效期语义彻底改变
TP5中Cache::set($k, $v, 0)表示永不过期;TP6中传0会触发框架默认过期时间逻辑(取stores.redis.expire配置值,默认3600秒),真正永不过期必须传null。
前端传参expire=0给接口,后端直接Cache::set($k, $v, $expire),结果缓存一小时就失效——这不是代码bug,是TP6对0值的语义重定义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











