我正在使用beanstalkd将一些工作卸载到其他机器上。设置有点不寻常,服务器在互联网上(公共IP),但消费者在一些人家的广告线后面。因此,有一个Linux服务器作为客户端通过动态IP外出并连接到服务器以获得工作。这都是PHP而我正在使用pheanstalk库。
一切都运行平稳一段时间,但随后adsl更改了IP(提供商强制断开连接重新连接的每24小时)客户端挂起,永远不会退出“保留”。
我认为在保留区暂停会有所帮助,但事实并非如此。看起来,客户端发出命令和阻塞,它永远不会检查超时。它只发出一个超时保留(而不是一个简单的保留),服务器负责在超时发生时返回TIME_OUT。问题是,连接中断了(但TCP / IP直到任何一方都试图与另一方通话才知道这一点)如果客户端阻止读取,它将永远不会返回。
该库似乎在本地支持某种超时(例如,当尝试连接到服务器时),但它似乎没有考虑这种情况。
我如何检测陈旧连接并强制重新连接?协议(以及pheanstalk本身)是否存在某种保持活动?
谢谢!
答案 0 :(得分:1)
您可以尝试在应答请求后立即关闭每个连接,并每次重新打开新连接。
没有close()
功能,但您使用unset($pheanstalk)
删除Pheanstaly对象将关闭它。
这个解释非常有用: Pheanstalk (PHP client for beanstalk) - how do connections work?
答案 1 :(得分:0)
我还没有尝试过,但我想到了通过SSH隧道连接到beanstalk服务器的想法。我们可以在隧道上启用ServerAliveCountMax
和ServerAliveInterval
选项,以便网络或服务器故障将导致隧道关闭。这应该会导致pheanstalk客户端报告错误。