thinkphp 8 中 cache::get() 返回 null 或报 driver [redis] not supported,主因是未安装 topthink/think-redis 扩展、php redis 扩展未启用、config/cache.php 中 default 未设为 'redis' 或 stores.redis 配置不完整(type 小写、select 整型、password 显式声明)、连接失败静默降级为 file 驱动。

升级到 ThinkPHP 8 后 Cache::get() 返回 null 或直接报 Driver not supported,基本不是缓存逻辑写错了,而是驱动类根本没加载进来——尤其是 Redis、File 这类非核心驱动,现在全得手动装、手动配、手动验。
Driver [redis] not supported?先确认 think-redis 是否真被加载
TP8 不再内置任何缓存驱动,topthink/think-redis 必须通过 Composer 安装,且 PHP 环境必须启用原生 redis 扩展,缺一不可。
- 运行
composer require topthink/think-redis,别只改composer.json后忘记install - 执行
php -m | grep redis,输出为空就说明扩展没启用;Linux 下检查php.ini是否有extension=redis.so,Windows 下是php_redis.dll - 重启 PHP-FPM 或 Apache,不重启,
class_exists('think\cache\driver\Redis')一定返回 false - TP8 的驱动注册机制变了:它不再自动扫描 vendor 包里的驱动类,必须靠扩展包的
service_provider注册,所以不装包 = 驱动不存在
Cache::get() 总是 null?检查 key 是否被框架悄悄改了
TP8 默认会对传入的 key 做哈希处理(比如 user:1001 变成 6b86b273ff...),你用原始 key 直连 redis-cli 查不到,不代表没存进去。
- 开启缓存日志:在
config/cache.php中加'logger' => 'cache',并在config/log.php配好cache通道,级别设为['debug', 'info'] - 查
runtime/log/cache/里实际set和get的 key 是什么,对比你代码里写的是否一致 - 绕过框架封装直查:用
Cache::store('redis')->get('user:1001'),这个调用跳过 key 处理逻辑,适合调试 - 如果仍返回 null,说明压根没写进去——去
redis-cli里执行KEYS cache_*,看有没有数据;没有,就是连接或认证失败,不是命中问题
配置里写了 'type' => 'redis' 却 fallback 到 file?大小写和 select 类型是硬伤
TP8 对驱动配置极其敏感:type 必须小写,select 必须是整数,password 即使为空也得显式写 '',否则静默降级。
-
'type' => 'Redis'或'type' => 'REDIS'→ 驱动识别失败,自动 fallback 到默认file,无任何提示 -
'select' => "0"(字符串)→ Redis 连接成功但SELECT命令不执行,所有操作都在 DB 0,但你可能连的是 DB 1 -
'password' => null或直接删掉这一行 → 认证失败,写入全部静默丢弃(尤其 Docker 环境下容易漏配) - 务必确认
config/cache.php中'default' => 'redis'和'stores' => ['redis' => [...]]两处都存在,缺stores.redis块 = 配置不完整 = 驱动不可用
File 驱动报 Permission denied?别只 chmod 777,要 fix owner
TP8 的 File 缓存会按 key 的 MD5 前两位建子目录(如 fa/),不同用户创建的子目录权限不互通——root 创建的 fa/,www 用户进不去。
- 错误现象:大部分 key 能缓存,只有特定手机号、订单号等触发报错,因为它们的 MD5 前缀刚好撞上 root 创建的目录
- 临时修复:
chown -R www:www runtime/(把www换成你 PHP-FPM 实际运行的用户) - 长期预防:所有后台命令(
crontab、supervisor)必须用sudo -u www php think xxx执行,禁止 root 直跑 - 别依赖
umask或chmod,TP8 的 File 驱动创建目录时不会自动设组写权限,owner 不一致才是根源
最常被忽略的一点:TP8 的驱动加载发生在容器启动阶段,config/cache.php 改完不 reload 应用(比如重启 FPM 或 Swoole server),旧配置还在内存里跑着。缓存失效问题,八成出在“你以为改了,其实没生效”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











