问题现象
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用 Redis 的 brpop
命令进行阻塞读取消息时,尽管设置了较长的超时时间(1小时),后台常驻 job 却在较短时间内异常退出。错误日志显示:“RedisException” with message ‘read error on connection’。
该问题源于 PHP 配置中的默认套接字超时限制,默认值为60秒 (default_socket_timeout = 60
),这影响了 Redis 扩展通过 socket 连接的超时行为,导致实际超时时间并非 brpop
设置的1小时,而是受制于PHP的全局配置。
操作步骤:
brpop
前,在脚本中加入以下代码行以临时覆盖默认的套接字超时设置:
ini_set('default_socket_timeout', -1); // 设置为-1表示无超时限制
brpop
操作。注意事项:
-1
表示无超时限制,应谨慎使用,确保程序逻辑能够妥善处理潜在的无限等待情况。直接修改 php.ini
文件中的 default_socket_timeout
参数,虽然可以全局解决超时问题,但可能影响到其他依赖相同配置的应用,因此此方法相对不灵活且风险较高。
rt_threshold_ms
等参数以匹配业务需求。 使用慢日志排查超时问题
Tair企业版配置参数列表