ThinkPHP Redis缓存配置失败导致Cache::get()返回null或报Driver[redis] not supported,根本原因是驱动未加载成功,须逐级验证:一、PHP redis扩展是否启用(php -m | grep redis必须输出redis);二、是否安装并注册topthink/think-redis包;三、config/cache.php中stores.redis配置是否完整且字段类型正确(type小写、select为整数、password显式声明)。

ThinkPHP Redis缓存驱动配置后Cache::get()始终返回null、写入无反应或报Driver [redis] not supported,说明框架根本没走Redis路径——不是缓存没命中,而是驱动压根没加载成功,必须从PHP扩展、Composer包、配置结构三层逐级验证。
确认PHP redis扩展已真实启用
执行php -m | grep redis,终端必须输出redis;无输出即代表扩展未生效,后续所有配置全是徒劳。
Linux/macOS用户若未安装,运行pecl install redis,然后编辑php.ini,确保有extension=redis.so且未被注释;Windows用户需下载与当前PHP版本(含TS/NTS、VC编译器、位数)完全匹配的php_redis.dll,放入ext目录,并在php.ini中添加extension=php_redis.dll。
【重启PHP-FPM和Web服务器后,必须再次执行php -m | grep redis验证,否则CLI环境和Web环境的PHP配置可能不一致】
立即学习“PHP免费学习笔记(深入)”;
扩展装错版本(如PHP 8.3装了PHP 7.x的dll)会导致Class 'Redis' not found,此时phpinfo()页面也看不到redis模块。
检查topthink/think-redis是否已安装并注册
ThinkPHP 6默认不内置Redis驱动类,仅配置参数而不安装该包,必然触发Driver [redis] not supported异常。
在项目根目录运行:composer require topthink/think-redis。
安装完成后,检查vendor/topthink/think-redis/src/Provider.php是否存在;该文件需被Composer自动加载,TP6.0+会通过autoload发现并注册服务提供者。
若使用Swoole常驻进程或自定义命令行任务,需手动调用ThinkRedisServiceProvider::register(),否则驱动不会注入容器。
逐项核对config/cache.php中的stores.redis配置
只改'default' => 'redis'远远不够,TP6必须存在完整且字段无误的stores.redis配置块,否则静默降级为file驱动,毫无提示。
第一步:确认'default' => 'redis'为全小写字符串,写成'Redis'或'REDIS'即失效。
第二步:在'stores' => []数组内,显式定义'redis'键,内容必须包含以下字段且类型严格:
• 'type' => 'redis'(小写,不可首字母大写)
• 'host' => '127.0.0.1'(不能是'localhost',部分DNS解析可能失败)
• 'port' => 6379(整数,非字符串"6379")
• 'select' => 0(整数,写成"0"会导致连接失败但无报错)
• 'password' => ''(空密码也必须显式声明,留空或写null会触发认证拒绝)
第三步:删除或注释掉其他同名store(如'redis_test'),避免因键名拼写错误导致fallback到file驱动。
注意:不支持redis:// URL格式,只能用host+port+select拆开配置。
用命令行直连验证Redis服务可达性
配置写完不代表连接通——能ping通IP端口 ≠ Redis服务响应正常,更不等于认证和DB选择正确。
执行redis-cli -a your_password ping(若设密码),返回PONG才表示服务可达且密码正确;若提示NOAUTH Authentication required,说明password字段漏填或填错。
再执行php -r "print_r((new Redis())->connect('127.0.0.1', 6379) && (new Redis())->auth('your_pass'));",输出1才证明PHP层直连成功。
最后,在redis-cli中执行KEYS *或KEYS think:*,确认缓存key是否真实写入;若为空,说明写入阶段已失败,不是命中问题,而是存储链断裂。



















