当前位置:网站首页>Redis 异常 read error on connection 解决方案
Redis 异常 read error on connection 解决方案
2022-04-23 09:30:00 【潘广宇 de 小白笔记】
一、造成原因与场景:
在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常:
PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection'
注:由于 php-fpm 对连接的重用性,所以,当存在cgi进程管理器[如php-fpm,spawn-cgi],使用 pconnect 效率比 connect 高。但是由于每个持久连接会占用内存,当并发量很大的时,很可能造成内存吃紧
二、出现原因
通过 pconnect 的 redis 长连接不会主动释放,会一直保持在php-fpm进程中,等待完成下一个请求的任务,即使通过 close 也仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。
这样会出现以下两种情况:
1)原因1 使用了已经断开的连接
假如这个连接已经断开了,下个请求可能直接使用上个断开的连接,当 php-fpm 处理下一个请求 reuse 一个断开的连接可能导致 read error on connection 的异常,以下是 phpredis 源码的解释:

2)原因2:执行超时
a)客户端设置的超时时间过短导致的;
b)客户端未设置超时时间,但是服务端执行时间超过了默认超时时间设置
php 有一个配置项 default_socket_timeout 表示一个 socket 连接的超时时间,默认是60s,而phpredis 这个扩展的底层连接 redis 是使用的 socket,所以当一个连接在60秒内没有被使用的时候,下次连接就会抛出这个异常。
三、解决方案
1)如果是原因1:
长连接改为短连接 或者 在 pconnect 中增加超时时间
$this->redis->pconnect($host, $port, 2); //@todo 2秒后该连接超时,将使用新的长连接
2)如果是原因2:修改超时时间
(不推荐) 方案1:
php.ini 中设置
default_socket_timeout = -1
然后重启php-fpm
方案2:
动态修改 php.ini
ini_set('default_socket_timeout', -1); // 不超时
方案3:
设置 redis 的超时时间为不超时:
$this->redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
参考:
版权声明
本文为[潘广宇 de 小白笔记]所创,转载请带上原文链接,感谢
https://panguangyu.blog.csdn.net/article/details/124296439
边栏推荐
- JS what is an event? Event three elements and operation elements
- OpenCV中的图像处理 —— 轮廓入门+轮廓特征
- ASUS laptop can't read USB and surf the Internet after reinstalling the system
- Pre parsing of JS
- Three ways to create objects in JS
- Cloud computing competition -- basic part of 2020 competition [task 3]
- NPM installation yarn
- How to render web pages
- MySQL of database -- Fundamentals
- SAP 101K 411k inventory change
猜你喜欢

ATSS(CVPR2020)

JS what is an event? Event three elements and operation elements

Leetcode题库78. 子集(递归 c实现)

GoLand debug go use - white record

112. 路径总和

To remember the composition ~ the pre order traversal of binary tree

Comparison of overloading, rewriting and hiding

【SQL server速成之路】数据库的视图和游标

The most concerned occupations after 00: civil servants ranked second. What was the first?

How to protect open source projects from supply chain attacks - Security Design (1)
随机推荐
Wechat applet catchtap = "todetail" event problem
ALV树(LL LR RL RR)插入删除
错题汇总1
Group Backpack
How to render web pages
Go language learning notes - structure | go language from scratch
亚马逊云科技入门资源中心,从0到1轻松上云
MySQL of database -- basic common query commands
MySQL - Chapter 1 (data types in MySQL)
EmuElec 编译总结
Where is int a = 1 stored
MySQL of database -- overview and installation
Flink SQL realizes the integration of stream and batch
Operation not allowed for a result set of type resultset TYPE_ FORWARD_ ONLY. Explain in detail
Learn FPGA (from Verilog to HLS)
成功的DevOps Leader 应该清楚的3个挑战
JS DOM learn three ways to create elements
2D 01 Backpack
Your guide to lowering your cholesterol with TLC (continuously updated)
#yyds干货盘点#ubuntu18.0.4安装mysql并解决ERROR 1698: Access denied for user ''root''@''localhost''