开发者社区 问答 正文

云服务器 ECS PHP 报错: 'read error on connection'什么原因



问题现象





一个后台常驻 job 通过 redis 的 brpop 阻塞读取消息时,设置的超时时间较长。
  1. list($key,$row)=$redis->brPop($queue_name,3600); //超时时间为1小时

但是在实际的使用中发现很短时间后就会退出,通过查看 error log,发现:’RedisException’ with message ‘read error on connection’ 提示。

问题分析





PHP 配置文件中有如下的配置: default_socket_timeout = 60
由于 Redis 扩展也是基于 PHP 的 socket 方式实现,因此该参数值同样会起作用。

问题处理





1. 直接修改 php.ini,将其设置为我们想要的值(这个不推荐)
2. 在我们的脚本中通过以下方式设置,这样就比较灵活,不对其他脚本产生影响
  1. ini_set('default_socket_timeout', -1); //不超时


如果问题还未能解决,您可以到阿里云社区进行 免费咨询,或联系 云市场商家寻求帮助。

展开
收起
boxti 2017-10-23 10:57:31 2482 分享 版权
阿里云 AI 助理回答

问题现象

在使用 Redis 的 brpop 命令进行阻塞读取消息时,尽管设置了较长的超时时间(1小时),后台常驻 job 却在较短时间内异常退出。错误日志显示:“RedisException” with message ‘read error on connection’。

问题分析

该问题源于 PHP 配置中的默认套接字超时限制,默认值为60秒 (default_socket_timeout = 60),这影响了 Redis 扩展通过 socket 连接的超时行为,导致实际超时时间并非 brpop 设置的1小时,而是受制于PHP的全局配置。

问题处理

方法一:临时修改脚本内超时设置

  • 操作步骤

    1. 在执行 brpop 前,在脚本中加入以下代码行以临时覆盖默认的套接字超时设置:
      ini_set('default_socket_timeout', -1); // 设置为-1表示无超时限制
      
    2. 然后正常执行 brpop 操作。
  • 注意事项

    • 此方法仅对当前运行的脚本生效,不会影响其他PHP脚本或应用。
    • 使用 -1 表示无超时限制,应谨慎使用,确保程序逻辑能够妥善处理潜在的无限等待情况。

方法二:调整 php.ini 配置文件(不推荐)

直接修改 php.ini 文件中的 default_socket_timeout 参数,虽然可以全局解决超时问题,但可能影响到其他依赖相同配置的应用,因此此方法相对不灵活且风险较高。

其他建议

  • 监控与日志:定期检查和优化 Redis 实例的慢日志,以便及时发现并定位性能瓶颈或网络延迟问题。
  • 资源管理:确保 Redis 服务端和客户端之间的网络连接稳定,减少因网络波动引起的连接中断。
  • 故障排查:如果问题持续存在,考虑检查 Redis 实例的代理慢日志(如果适用)以及实例参数配置,适当调整如 rt_threshold_ms 等参数以匹配业务需求。

参考资料

使用慢日志排查超时问题
Tair企业版配置参数列表

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答