thinkphp项目迁移时缓存驱动配置不同步会导致cache::get()返回null、写入静默失败或降级为file驱动;需同步default值、完整校验stores.redis字段(select为整型、password显式声明)、启用phpredis扩展、安装think-redis包、清理runtime/cache并统一键名与序列化策略。

ThinkPHP项目迁移时缓存驱动配置不同步,会导致Cache::get()始终返回null、写入静默失败或降级为file驱动——你改了config/cache.php,却没动.env;配了redis.host,却漏掉select必须是整数;装了think-redis,但PHP redis扩展根本没启用。
确认迁移前后缓存驱动类型是否一致
打开旧项目config/cache.php,复制'default' => 'xxx'的值(如'redis');再打开新项目同文件,确保该字段完全一致,【大小写敏感,不能写成'Redis'或'REDIS'】。
若旧项目用.env控制,检查旧项目.env中CACHE_DRIVER=xxx是否与新项目.env中对应项相同;【TP8不读取REDIS_HOST等环境变量,只认config/cache.php里的stores.redis配置】。
执行php think tinker → 输入config('cache.default'),输出必须与预期驱动名完全匹配。
逐项核对stores配置块字段完整性
方法一:对比式校验
在旧项目根目录运行php -r "print_r(config('cache.stores.redis'));";记录输出;在新项目执行同样命令,人工比对host、port、password、select、timeout、prefix六项是否全部存在且类型正确。
特别注意select必须是整型0,不是字符串"0";password为空也必须显式写'',否则连接会被拒绝。
方法二:强制验证连接
在新项目中执行:php think tinker → (new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping();
返回+PONG才算通过;返回false或报错说明host不可达、port被拒、密码错误或扩展未加载。
这一步跳过就等于没验证——配置看着全,其实连不上。
同步PHP扩展与Composer依赖
第一步:检查PHP redis扩展是否启用
在新服务器执行php -m | grep redis;无输出则立刻安装:pecl install redis,并在php.ini中添加extension=redis.so(Linux)或extension=php_redis.dll(Windows),重启PHP-FPM。
第二步:安装ThinkPHP官方适配包
运行composer require topthink/think-redis;确认vendor/topthink/think-redis/src/Driver.php存在,且composer.json中已写入"topthink/think-redis": "^3.0"。
【Driver [redis] not supported错误,90%源于未执行此命令】
第三步:清理运行时缓存
删除新项目runtime/cache/目录下全部内容;否则旧配置可能被自动加载缓存住,导致新配置不生效。
键名与序列化策略一致性处理
旧项目若使用serialize()序列化,而新项目PHP版本≥8.1,含闭包或资源句柄的数据会序列化失败;统一改为json编码,在config/cache.php的stores.redis中添加'serialize' => 'json'。
检查旧项目缓存键是否含空格、斜杠、中文;这些在file驱动下会生成非法文件名,写入失败却无报错。新项目强制规范键名:只允许字母、数字、下划线,如user_profile_1001。
若旧项目用了think:前缀,新项目也要保持一致,或在stores.redis中显式设'prefix' => 'think:';否则用redis-cli查不到数据,跨项目调试直接断链。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











