9

“PHP 致命错误:未捕获的异常 'RedisException' 带有消息 '读取连接错误'”

这里的驱动是phpredis

$redis->blpop('a', 0);

这总是在约 1 分钟后超时。我的 redis.conf 说超时 0 并$redis->getOption(Redis::OPT_READ_TIMEOUT)返回double(0)

如果我这样做,它永远不会超时$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

为什么我需要-1?Redis 文档timeout 0在 redis.conf 中说永远不应该让我超时。

“默认情况下,如果客户端空闲数秒,Redis 的最新版本不会关闭与客户端的连接:连接将永远保持打开状态。”

4

4 回答 4

12

我知道的当前解决方案是禁用 phpredis 的持久连接,因为自 2011 年 10 月以来它们已被报告为错误。如果您使用 php-fpm 或其他线程模型,该库会专门禁用持久连接

可以通过调整 php.inidefault_socket_timeout来降低此错误的频率。

此外,phpredis 中的读取超时配置并非普遍支持。该功能(查找OPT_READ_TIMEOUT)是在标签 2.2.3 中引入的

于 2013-08-06T18:14:36.897 回答
2

经过大量的文章研究并做了我自己的redis和php的strace,这个问题似乎很容易被这个解决方案解决。我的用例中的主要问题是 redis 服务器无法分叉一个进程来将内存中的写入保存到磁盘数据库中。

我在 php.ini 和 redis.conf 中保留了所有超时值,因为它们没有进行建议的骇人听闻的更改,然后单独尝试了上述解决方案,并且使用有关更改的所有建议无法解决此问题“连接时读取错误”跨 php 和 redis conf 文件的超时值消失了。

我还看到了一些关于将文件描述符限制增加到 100000 等的建议。我在云服务器上运行我的用例,文件描述符限制为 1024,我的用例甚至可以完美地运行该限制。

于 2014-02-24T20:36:28.197 回答
2
$redis->connect(host, port, timeout1);

......

$redis->blpop($key, timeout2);

其中 timeout1 必须比 timeout2 长。

于 2017-03-28T06:01:08.067 回答
1

我在我的 php 程序中添加了代码ini_set(‘default_socket_timeout’, -1),但我发现它没有立即工作。

然而3分钟后,当我再次开始运行php程序时,我终于找到了原因:redis连接不持久

所以我设置timeout=0了我redis.conf的,问题就解决了!

于 2014-04-27T09:42:10.467 回答