Redis扩展未安装导致Class 'Redis' not found,需按系统安装对应扩展并重启服务;Redis服务未启动、防火墙拦截、配置错误(如bind地址、密码、Docker网络)也会导致连接失败;优先使用phpredis扩展,序列化不一致或缓存前缀问题会导致取值为null。
Redis 扩展没装,
启动直接报
不是 ThinkPHP 配置问题,是 PHP 根本不认识
这个类。Linux 下常见于用包管理器装了
,但漏掉 PHP 的
扩展;Windows 下则是没把
放进
目录、或没在
里启用。
Linux(以 Ubuntu/Debian 为例):运行
,然后重启 Web 服务(
或
)
Linux(CentOS/RHEL):先确认 PHP 版本(如
),再装对应扩展,例如
或
Windows:下载与 PHP 版本、线程安全(TS/NTS)、架构(x64/x86)完全匹配的
(推荐从
pecl.php.net
获取),放进
,并在
中添加
验证是否生效:执行
(Linux/macOS)或
看输出里有没有
;也可写个
页面查
ThinkPHP 配置 Redis 缓存驱动时,
和
写对了还是连不上
多数情况是 Redis 服务压根没跑,或者防火墙/SELinux 拦住了连接。ThinkPHP 的
配置只是“告诉它怎么连”,不负责启动服务或放行端口。
先本地测试连通性:命令行执行
,返回
才算通;如果超时或拒绝连接,说明服务未启动或网络不通
Docker 场景下注意:别用
,容器内要访问宿主机 Redis 得用
(Mac/Windows)或宿主机真实 IP(Linux)
云服务器(如阿里云、腾讯云):检查安全组规则是否放行了
端口,且 Redis 配置里
没写死只监听
(需改为
或注释掉)
密码配置别漏:如果 Redis 设了密码,ThinkPHP 配置里必须填
项,否则认证失败会静默降级或报错
和
两种驱动选哪个?
ThinkPHP 默认用
(C 扩展),性能高、稳定性好;
是纯 PHP 实现,无需编译扩展,但依赖更多、并发下容易出连接问题。
优先选
:只要扩展装好了,ThinkPHP 会自动用它,不用额外配;
中
值保持默认
即可
只有在无法安装扩展时才退而求其次用
:需
,并把
改成
;注意
对 Redis 6+ 的 ACL 支持不完善,遇到
错误大概率是它的问题
别混着用:同时装了
扩展又手动指定
,反而可能因 autoload 冲突导致奇怪错误
缓存写入正常但取不到,
返回
不是驱动问题,大概率是序列化方式不一致或 key 被意外清空。ThinkPHP 默认用
,而某些 Redis 客户端(比如用
时设了
)会存成 JSON 字符串,导致反序列化失败。
立即学习
“
PHP免费学习笔记(深入)
”;
检查
中
选项:确保没被改成
或其他值,除非你明确知道在用什么序列化协议
用
直接看 key 内容:执行
,如果返回的是乱码或 PHP 序列化字符串(如
),说明序列化正常;如果返回 JSON 字符串(如
),说明序列化方式被改过
注意缓存前缀和大小写:ThinkPHP 默认加前缀(如
),
实际查的是
;手动用
查时得带上前缀
开发环境开
模式后,ThinkPHP 有时会自动清理缓存,导致刚写入就消失——关掉
或换到
目录外调试
Redis 扩展和配置本身不难,真正卡住人的永远是那层“以为配对了”的错觉:扩展没加载、服务没起来、端口被拦、序列化不匹配……多动手敲几条
命令,比翻十遍文档都管用。
thinkphpClass 'Redis' not foundRedisredis-serverredisphp_redis.dllextphp.inisudo apt install php-redissudo systemctl restart apache2sudo systemctl restart php8.1-fpmphp -vsudo yum install php-pecl-redissudo dnf install php-pecl-redisphp_redis.dllphp/ext/php.iniextension=php_redis.dllphp -m | grep redisphp -mredisphpinfo()hostportcache.phpredis-cli -h 127.0.0.1 -p 6379 pingPONG127.0.0.1host.docker.internal6379bind127.0.0.10.0.0.0passwordphpredispredisphpredispredisphprediscache.phptyperedisprediscomposer require predis/predistypepredispredisNOAUTHphpredispredisgetnullserialize()predisserializer => 'json'cache.phpserializefalseredis-cliget cache_key_namea:1:{i:0;s:5:"hello";}{"data":"hello"}think:get('user_123')think:user_123redis-clidebugapp_debugruntimeredis-cli