phpredis扩展装完就完事?连接超时、序列化和长连接三个坑先排掉

来源:互联网 时间:2026-08-30

 

PHP连Redis基本都用phpredis这个C扩展,pecl一键装完,new Redis一句就连上了。但默认配置是给本机测试用的,直接上生产迟早出问题。下面三个坑是我见过翻车率最高的。

第一个坑:连接超时没设。默认连接超时是0,意思是永远等。Redis那边要是卡了,PHP进程全在等连接,FPM的worker被占光,整站502。

$redis = new Redis();
$redis->connect(
'127.0.0.1', // 主机
6379, // 端口
1.5, // 连接超时1.5秒,必设
); // 再补个读写超时
$redis->setOption(Redis::OPT_READ_TIMEOUT, 2);

第二个坑:序列化方式用默认的。phpredis存数组默认不序列化,存进去就是“Array”字符串,读出来是乱码。必须在连接后设一次序列化器,PHP_SESSION用phpserialize,缓存场景用igbinary更省内存,没装扩展就用serialize。

// 存数组前必须设置序列化
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
$redis->set('user:1001', ['name' => '老王', 'vip' => 3]); // OK

// 不设置时存数组,读回来就是字符串“Array”,数据直接没了

第三个坑:短连接在高并发下把Redis连接数打爆。每个PHP请求都新建TCP连接,QPS一高,Redis那边的connected_clients蹭蹭涨,直到超过maxclients报错。解决靠pconnect长连接,FPM每个worker复用自己的连接。

// pconnect:同worker进程复用连接,省去每次握
$redis->pconnect('127.0.0.1', 6379, 1.5);

# Redis侧确认连接数
redis-cli info clients
# connected_clients 正常应≈FPM进程数,而不是QPS量级

验证整套配置:写个页面循环get一百次看耗时;用redis-cli的client list看连接来源是不是稳定的一批;故意把Redis停掉,看网站是不是1.5秒后正常报错降级,而不是卡死全场。三个测试都过,这套连接才算能上生产。

还有个细节,phpredis和 predis 纯PHP库别混着选。predis免编译但慢三到五倍,小站无所谓,正经流量还是phpredis。装完phpinfo()里看redis扩展版本,3.x和5.x的API有些差异,升级前看一眼CHANGELOG能省不少事。

相关文章

A5创业网 版权所有

返回顶部