将 redis 用于 php 5.2 分支。 我收到随机的“从服务器读取行时出错”错误。 我使用的命令是 lpush 一个序列化的字符串。
我在 php 守护进程脚本上使用 predis,这意味着它一直在运行。 我已经将 redis.conf 的超时设置为 0。
谢谢你。 我将尝试设置 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 秒,您可以尝试提高它的值,但我认为这不能解决您的问题。 当这些超时发生时,您应该尝试查看服务器上发生了什么,这实际上取决于您的应用程序,因此我无法提供任何帮助。 这些超时的可能原因可能是:
KEYS
命令的昂贵调用吗? 根据 Redis 上存储的密钥数量, KEYS
最终可能会阻塞服务器,同时,它将无法处理其他请求或传入连接。我暂时将这个问题悬而未决,但我很确定它绝对与 Predis 无关。
nrk。 按照建议,我已将 connection_timeout 提高到 30。将对此进行监控。
另一个更新,我测量了连接,看起来确实在5s后发生了异常。 我尝试通过以下方式修改 connection_timeout:
new Predis_Client($param, array('read_write_timeout' => -1, 'connection_timeout' => 30));
那是对的吗? 它似乎没有生效 30s connection_timeout 并且仍然抛出异常。
它们是连接参数而不是客户端选项,因此必须将read_write_timeout
和connection_timeout
指定为$param
。
老实说,在连接到主机时,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 的常规缓存使用中是否有任何损坏或错误的可能性!
谢谢 !
最有用的评论
如果您在类似守护进程的脚本中使用 Predis,如果您想完全禁用超时,您应该将
read_write_timeout
为-1
(该值适用于较旧和较新版本的 Predis)。 另外,请记住,您必须通过在redis.conf 中设置timeout = 0
来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。