ThinkPHP中Cache::get()返回null或报Driver not supported,主因是Redis驱动未注册或连接参数错误;须安装topthink/think-redis扩展、启用PHP redis模块、配置config/cache.php中default为'redis'且stores.redis完整(type小写、select为整数、password显式声明)、设置正确host/port/select、关闭前缀便于调试、启用persistent连接,并用cache()命令行验证读写。

如果您在ThinkPHP项目中启用Redis作为缓存后端,但Cache::get()始终返回null或抛出Driver not supported异常,则问题大概率出在驱动未正确注册或连接参数不匹配。以下是解决此问题的步骤:
一、安装think-redis扩展并启用PHP Redis扩展
ThinkPHP 6默认不内置Redis驱动,必须通过Composer安装官方扩展,并确保PHP环境已加载原生redis扩展。仅安装PHP包而不启用扩展会导致Cache::store('redis')调用时抛出ClassNotFoundException。
1、执行命令安装扩展:composer require topthink/think-redis
2、验证PHP是否已启用redis扩展:php -m | grep redis(Linux/macOS)或在phpinfo()页面中确认存在redis模块
立即学习“PHP免费学习笔记(深入)”;
3、若未启用,需在php.ini中添加:extension=redis.so(Linux)或extension=php_redis.dll(Windows),然后重启Web服务器
二、修正config/cache.php中的驱动类型与store配置
驱动类型名大小写敏感,且必须显式定义redis store块;仅修改default值而缺失stores.redis完整配置将导致fallback至file驱动,造成静默失效。
1、将config/cache.php中的default字段设为:'default' => 'redis'
2、在stores数组中添加完整redis配置块,确保type为全小写:'type' => 'redis'(不可写作'Redis'或'REDIS')
3、确认select参数为整数类型:'select' => 0(不可写作字符串"0",否则连接静默失败)
4、password为空时也必须显式声明:'password' => ''
三、配置Redis连接参数与前缀控制
host、port、database(即select)、密码等必须与实际Redis实例完全一致;前缀设置影响键名可见性,调试时需同步调整CLI查询方式。
1、设置正确的连接地址和端口:'host' => '127.0.0.1', 'port' => 6379
2、如使用Docker或远程服务,需替换host为宿主机IP或host.docker.internal,并检查redis.conf中bind是否包含对应地址
3、关闭默认think:前缀以便redis-cli直接查看:'prefix' => ''
4、如需多项目隔离,建议设为自定义前缀:'prefix' => 'tp6_shop:'
四、启用持久连接与连接超时控制
高并发场景下未启用持久连接易触发连接耗尽,timeout过短则导致频繁重连失败;这些参数需在stores.redis中显式声明,不可依赖默认值。
1、开启持久连接防连接风暴:'persistent' => true
2、设置合理连接超时时间:'timeout' => 30
3、避免使用0作为超时值,否则可能引发阻塞:禁止设置'timeout' => 0
4、expire参数单位为秒,传0表示立即删除,非永不过期:永久缓存应传null而非0
五、验证缓存驱动是否真正生效
不能仅依赖代码无报错来判断驱动启用成功,必须通过命令行实测写入与读取行为,排除配置被覆盖或环境差异干扰。
1、执行写入测试:php -r "var_dump(cache('test_key', 'test_value', 10));"
2、执行读取验证:php -r "var_dump(cache('test_key'));"
3、若第一步返回true、第二步返回'test_value',说明驱动与连接均正常
4、若仍返回null,立即检查redis-cli是否能连上同一host:port:select组合:redis-cli -h 127.0.0.1 -p 6379 -n 0 get 'think:test_key'



















