PHP Redis超时,连接读取错误?
“PHP致命错误:未捕获异常‘RedisException’,消息为‘连接读取错误’” 这里的司机是菲普雷迪斯PHP Redis超时,连接读取错误?,php,redis,phpredis,Php,Redis,Phpredis,“PHP致命错误:未捕获异常‘RedisException’,消息为‘连接读取错误’” 这里的司机是菲普雷迪斯 $redis->blpop('a', 0); 这总是在约1分钟后超时。My redis.conf显示超时0和$redis->getOption(redis::OPT_READ_timeout)返回double(0) 如果我这样做,它就不会超时$redis->setOption(redis::OPT_READ_TIMEOUT,-1) 为什么我需要-1?Redis文档说Redis.
$redis->blpop('a', 0);
这总是在约1分钟后超时。My redis.conf显示超时0和$redis->getOption(redis::OPT_READ_timeout)
返回double(0)
如果我这样做,它就不会超时$redis->setOption(redis::OPT_READ_TIMEOUT,-1)代码>
为什么我需要-1?Redis文档说Redis.conf中的timeout 0
不应该让我超时
“默认情况下,如果客户端空闲数秒,Redis的最新版本不会关闭与客户端的连接:连接将永远保持打开状态。”我所知道的当前解决方案是禁用phpredis的持久连接,就像它们一直以来一样。如果您使用的是php fpm或其他线程化模型,则可以使用该库
通过以下方法可以降低此错误的频率
此外,phpredis中的读取超时配置并不普遍受支持。该功能(查找OPT\u READ\u TIMEOUT
)是。在对文章进行了大量研究并对redis和php进行了自己的研究之后,这个问题似乎很容易解决。我的用例中的主要问题是redis服务器无法将内存中的写操作保存到磁盘数据库中
我保留了php.ini和redis.conf中的所有超时值,没有进行建议的黑客更改,然后单独尝试了上述解决方案,使用所有关于在php和redis-conf文件中更改超时值的建议都无法解决的“连接读取错误”问题消失了
我还看到了一些关于将文件描述符的限制提高到100000等的建议。我正在一个文件描述符限制为1024的云服务器上运行我的用例,我的用例在这个限制下运行得非常好。我在我的php程序中添加了代码ini\u集('default\u socket\u timeout',-1)
,但我发现它没有立即起作用
然而,在我再次开始运行php程序的3分钟后,我终于找到了原因:redis连接不是持久的
因此,我在我的redis.conf
中设置了timeout=0
,问题就解决了
$redis->connect(host, port, timeout1);
其中超时1必须长于超时2
$redis->blpop($key, timeout2);