Predis: 从服务器读取行时出错

创建于 2011-06-16  ·  21评论  ·  资料来源: predis/predis

将 redis 用于 php 5.2 分支。 我收到随机的“从服务器读取行时出错”错误。 我使用的命令是 lpush 一个序列化的字符串。

我在 php 守护进程脚本上使用 predis,这意味着它一直在运行。 我已经将 redis.conf 的超时设置为 0。

最有用的评论

如果您在类似守护进程的脚本中使用 Predis,如果您想完全禁用超时,您应该将read_write_timeout-1 (该值适用于较旧和较新版本的 Predis)。 另外,请记住,您必须通过在redis.conf 中设置timeout = 0来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。

所有21条评论

在打开具有相同标题的新问题之前,您是否已经按照此处描述的步骤调试问题? 另请参阅 Redis 列表上的此线程,它也可能与客户端问题无关。

谢谢你。 我将尝试设置 socket_timeout 和 read_write_timeout 并稍后在此处报告我的发现。

如果您在类似守护进程的脚本中使用 Predis,如果您想完全禁用超时,您应该将read_write_timeout-1 (该值适用于较旧和较新版本的 Predis)。 另外,请记住,您必须通过在redis.conf 中设置timeout = 0来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。

nrk,如上所述进行了尝试,现在运行良好。 谢谢!

但是,时不时仍然有很多连接超时。 我已经将 timeout = 0 和 read_write_timeout 设置为 -1。 当它发生时,我们可以做些什么来调试它?

timeout不是 Predis 识别的连接参数,您应该使用connection_timeout代替。 connection_timeout的默认值是 5 秒,您可以尝试提高它的值,但我认为这不能解决您的问题。 当这些超时发生时,您应该尝试查看服务器上发生了什么,这实际上取决于您的应用程序,因此我无法提供任何帮助。 这些超时的可能原因可能是:

  1. 如果您的 Redis 服务器不在本地主机上,则会出现网络连接问题
  2. 您确定您没有在脚本中的某处使用对KEYS命令的昂贵调用吗? 根据 Redis 上存储的密钥数量, KEYS最终可能会阻塞服务器,同时,它将无法处理其他请求或传入连接。

我暂时将这个问题悬而未决,但我很确定它绝对与 Predis 无关。

nrk。 按照建议,我已将 connection_timeout 提高到 30。将对此进行监控。

  1. 是的,我们正在使用多个不是本地主机但它们在私有网络上的 redis 节点(所以至少应该更稳定?)
  2. 不使用密钥。 但是,我们每 900 秒进行一次快照。 从日志看来,系统需要 8 秒才能保存到 HD。 不应该是连接超时的原因吗?
  3. 关于如何在超时发生时监视服务器的任何建议? 超时非常随机。 我检查了 redis 日志,主要是快照消息。

另一个更新,我测量了连接,看起来确实在5s后发生了异常。 我尝试通过以下方式修改 connection_timeout:

new Predis_Client($param, array('read_write_timeout' => -1, 'connection_timeout' => 30));

那是对的吗? 它似乎没有生效 30s connection_timeout 并且仍然抛出异常。

它们是连接参数而不是客户端选项,因此必须将read_write_timeoutconnection_timeout指定为$param

  1. 除非它不是 Amazon EC2 上的私有网络(高延迟和不时的各种问题),否则它不应该。
  2. 据我所知,快照不应阻止服务器
  3. 您可以根据快照日志检查超时时间。 除此之外,它实际上取决于您的应用程序和基础设施的架构,抱歉,我无法为您提供支持。

老实说,在连接到主机时,Predis 并没有对套接字资源做任何花哨的事情,因为它几乎完全委托给 PHP 的内部结构,因此它可能是 PHP 中的错误(不太可能,但仍有可能)或某些配置/运行时您的服务器上的问题,或者 Redis 执行一些繁重的操作,最终导致服务器阻塞一段时间。

nrk,再次感谢您的回复。 我发现了问题,这只是服务器耗尽 ip_conntrack 的问题。 一旦 conntrack 被修复,连接超时也会消失。

很高兴知道您终于找到了这些超时背后的实际问题。 我可能会在常见问题解答中的某处添加它,以便为用户提供用于排除超时问题的初始检查列表。

遇到相同的错误,使用将 read_write_timeout 设置为 0 来解决。
我在 predis 中做到了,我们可以使用 predis 客户端做同样的事情吗?
如此处所示 http://code.google.com/p/dires/source/browse/trunk/predis/examples/PubSubContext.php?r=4
我正在使用以下方法制作 predis 客户端: $redis = new Predis\Client("tcp://".$turboConfig->getActivitiesRedisHost()); 我应该如何在我的实现中传递 read_write_timeout。

@amitchhajer客户端接受具有命名数组或 URI 字符串的相同连接参数,因此如果您使用的是 URI 字符串,则可以将其添加为查询字符串: tcp://127.0.0.1:6379?read_write_timeout=0

@nrk感谢您提供的信息,现在运行良好。

如果我们需要在运行时更改 read_write_timeout 怎么办? 是否存在超时参数的设置器(构造函数除外)?

@bondeg连接参数有意是不可变的,这意味着一旦连接初始化就无法更改它们,但是您可以通过从客户端使用的连接对象中获取底层流资源并相应地更改流选项来解决此限制。 这是一个小片段,假设您没有在集群或复制模式下使用客户端:

$connection = $client->getConnection();
$stream = $connection->getResource();
stream_set_timeout($stream, 2);

请注意,执行$connection->getResource()有效地触发对 Redis 的connect()操作,因此您最终可能会失去延迟连接的好处,具体取决于您将如何使用此功能。

请注意,在新版本的 Predis 中,参数connection_timeout已重命名为timeout

我非常广泛地使用“ h键”。 这会导致锁定吗?

如果您在类似守护进程的脚本中使用 Predis,如果您想完全禁用超时,您应该将read_write_timeout-1 (该值适用于较旧和较新版本的 Predis)。 另外,请记住,您必须通过在redis.conf 中设置timeout = 0来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。

与在 redis.conf 中设置 timeout=0 相关的任何缺点或注意事项?

我怀疑的是..因为连接永远不会掉线
Redis 利用率将保持高位

nrk,再次感谢您的回复。 我发现了问题,这只是服务器耗尽 ip_conntrack 的问题。 一旦 conntrack 被修复,连接超时也会消失。

如何修复这份合同..在哪里寻找?

与在 redis.conf 中设置 timeout=0 相关的任何缺点或注意事项?

@aditya-rewari-cb 实际上 redis.conf 中的timeout = 0是自 Redis 2.4(几年前发布)以来的默认值,所以我想说没有缺点。

如果您在类似守护进程的脚本中使用 Predis,如果您想完全禁用超时,您应该将read_write_timeout-1 (该值适用于较旧和较新版本的 Predis)。 另外,请记住,您必须通过在redis.conf 中设置timeout = 0来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。

@nrk我正在将 Redis 与守护进程(laravel 主管工作人员)以及定期缓存一起使用
使用 'read_write_timeout' => -1 有什么注意事项吗?
由于此更改,我想确认在我对 Redis 的常规缓存使用中是否有任何损坏或错误的可能性!

谢谢 !

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ghost picture ghost  ·  4评论

m157y picture m157y  ·  14评论

Horki picture Horki  ·  6评论

eventbase-web picture eventbase-web  ·  5评论

koda0611 picture koda0611  ·  4评论