PHP连接Redis缓存核心是装对phpredis扩展并正确调用Redis::connect(),缺一则报错或静默失败;扩展未启用则class_exists('Redis')为false,connect失败多因host/port/password/select配置错误或超时未设。

PHP连接Redis缓存,核心就两件事:装对扩展、连对地址。其他配置都是围绕这两点展开的补充和兜底。
phpredis扩展没装或没启用,new Redis()直接报错
这是最常卡住的第一步。不装扩展,PHP根本不认识Redis这个类,更别说调用connect()或setex()了。
- Linux(Ubuntu)直接跑:
sudo apt-get install php-redis;CentOS 用:sudo yum install php-pecl-redis - Windows用户别去手动下DLL再改
php.ini——容易TS/NTS版本错配,推荐用XAMPP或WAMP自带扩展管理器勾选启用 - 装完必须重启Web服务(Apache/Nginx)或PHP-FPM,否则
php -m | grep redis看不到,extension=redis.so在php.ini里也白写 - 确认是否生效:写个
test.php,内容就一行var_dump(class_exists('Redis'));,返回bool(true)才算过关
Redis::connect()连不上,常见错误是超时或认证失败
连不上不是代码写错了,大概率是网络、密码、数据库编号这三样没对齐。
- 先用命令行验证Redis服务本身是否活着:
redis-cli -h 127.0.0.1 -p 6379 ping,得回PONG;如果连不上,先查Redis进程、防火墙、SELinux - 密码必须显式调用
$redis->auth('your_password'),空密码也要调,不能跳过;auth必须在connect()之后、select()之前 -
select()参数必须是整数,比如$redis->select(1),不能写"1"或null,否则会静默失败 - 超时默认是0(阻塞),生产环境务必设非零值:
$redis->connect('127.0.0.1', 6379, 2.5),第三个参数是连接超时秒数
ThinkPHP里配Redis缓存,CACHE_DRIVER=redis只是第一步
ThinkPHP不会自动读你redis.conf里的配置,它只认自己那一套字段,漏一个或类型不对就会fallback到file驱动。
立即学习“PHP免费学习笔记(深入)”;
- 优先改
.env文件:CACHE_DRIVER=redis(全小写,不能写Redis) - 然后检查
config/cache.php里stores.redis块,必须有且仅含这些键:'type' => 'redis'、'host' => '127.0.0.1'、'port' => 6379、'password' => ''(空字符串,不是null)、'select' => 0(整数) -
timeout建议设为3,不是0;prefix调试期可设为空串'',方便用redis-cli keys "*"看真实key - 改完清缓存:
php think cache:clear,否则配置可能被旧缓存锁死
缓存数组或对象时,serialize()和unserialize()不是可选项
Redis原生只存字符串。你set('user', $arr)看似成功,实际存进去的是"Array"三个字母,取出来永远是乱码或false。
- 写入前必须
$redis->set('user:1001', serialize($user));读取后必须$user = unserialize($redis->get('user:1001')) - 用
json_encode()/json_decode()也可以,但要注意中文编码、浮点精度、对象方法丢失等问题;serialize更忠实还原PHP结构 -
unserialize()处理不可信数据有反序列化漏洞风险,业务上必须确保key来源可控,或加签校验 - 如果用
setex()带过期时间,注意第二个参数是秒数,0表示立即删除,null才表示永不过期
真正容易被忽略的是连接复用和异常兜底——每次请求都new Redis()再connect(),短连接开销大,还可能触发Redis连接数上限;而一旦Redis挂了又没包try-catch,整个接口就崩。这些细节不写进代码里,压测时第一个爆的就是它。



















