【问题标题】:PHP Redis timeout, read error on connection?PHP Redis超时,连接时读取错误?
【发布时间】:2013-08-07 00:01:24
【问题描述】:

“PHP 致命错误:未捕获的异常 'RedisException' 并带有消息 'read error on connection'”

这里的驱动是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 文档说 redis.conf 中的 timeout 0 永远不应该让我超时。

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

【问题讨论】:

    标签: php redis phpredis


    【解决方案1】:

    我知道的当前解决方案是禁用 phpredis 的持久连接,因为它们一直是 reported as buggy since October 2011。如果您使用 php-fpm 或其他线程模型,库 specifically disables persistent connections

    adjusting the php.ini default_socket_timeout value 可能会降低此错误的频率。

    另外,phpredis 中的读取超时配置并不是普遍支持的。功能(查找OPT_READ_TIMEOUT)是introduced in tag 2.2.3

    【讨论】:

      【解决方案2】:

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

      我在 php.ini 和 redis.conf 中保留了所有超时值,没有进行建议的 hacky 更改,然后单独尝试了上述解决方案,并且使用所有关于在 php 和 redis conf 文件中更改超时值的建议消失了。

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

      【讨论】:

        【解决方案3】:
        $redis->connect(host, port, timeout1);
        

        .....

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

        其中timeout1必须比timeout2长。

        【讨论】:

          【解决方案4】:

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

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

          于是我在我的redis.conf中设置了timeout=0,问题就解决了!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-29
            • 2023-03-06
            • 2017-06-28
            • 2023-01-31
            • 2012-02-25
            • 1970-01-01
            • 2010-11-26
            • 2011-12-05
            相关资源
            最近更新 更多