当前位置:首页 >  站长 >  编程技术 >  正文

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

 2026-08-30 10:29  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

 

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能省不少事。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
php教程
php开发工具

相关文章

  • Redis重启数据全丢?RDB和AOF持久化怎么选,别拍脑袋

    Redis快是真快,代价是数据在内存里,进程一崩、机器一断电,没落盘的数据就没了。站长场景里最疼的两种:一是拿Redis存Session,重启一次全员掉线重登;二是拿它存计数器和队列,重启后数字归零、任务丢失。持久化配置平时没人看,出事才知道疼。Redis给两种持久化方案。RDB是定时快照,每隔一段

    标签:
    php教程
  • 网站加了两台服务器用户就掉线?PHP Session存Redis,十分钟搞定多机共享

    单机跑得好好的站,一上负载均衡就出怪事:用户登录着,刷新一下变成未登录;购物车里的东西随机消失。十有八九是Session的问题——Session默认存在本机文件里,用户第一次请求落在A机,Session写在A机,第二次请求被分到B机,B机根本没这个Session,可不就掉线了。解决思路就一句话:Se

    标签:
    php教程
  • Redis缓存穿透打垮数据库?空值缓存加布隆过滤器双保险

    缓存穿透的典型场景:有人拿脚本扫你的站,每次请求一个根本不存在的ID,比如/goods.php?id=99999999。Redis里查不到,请求全落到MySQL,而MySQL也查不到,什么都不缓存。下一波请求还是这个流程,数据库白挨打,缓存形同虚设。跟缓存击穿(某个热key过期)不一样,穿透的点是“

    标签:
    php教程
  • 手机端图片占了八成流量?srcset 响应式图片让每个设备只下载该下的那张

    打开手机流量一看,一个页面干了3MB,图片占了八成。罪魁祸首通常是同一张2000px宽的大图,PC和手机都在原样下载——手机屏幕400px宽,下载的像素是实际需要的几十倍,流量和渲染性能全浪费了。srcset就是解决这个问题的原生方案,不用任何JS。先准备好同一张图的多个尺寸版本,然后一行代码让浏览

    标签:
    php教程
  • 网站流量全靠猜?GoAccess 一个命令把 access.log 变成可视化报表

    想看昨天哪个页面流量最大、蜘蛛抓了多少、404都出在哪,去后台翻统计插件数据又慢又不全——统计脚本本身还拖累页面速度。其实答案全在access.log里,GoAccess能把日志直接变成终端里的实时报表,不碰你的网站一行代码。#安装yuminstall-yepel-release&&yuminsta

热门排行

信息推荐