我正在使用beanstalkd将一些工作卸载到其他机器上。设置有点不寻常,服务器在互联网(公共ip)上,但消费者在一些家庭的adsl线路后面。因此,有一台linux服务器作为客户端,通过一个动态ip连接到服务器上获取作业。这都是PHP,我使用的是pheanstalk库。
一切都顺利地运行了一段时间,但随后adsl改变了IP (每24小时提供商强制断开-重新连接),客户端就挂起了,永远不会超出“保留”。
我认为在保留空间设置一个超时时间会有所帮助,但事实并非如此,就像客户端发出一个命令并阻塞一样,它从不检查超时时间。它只是发出一个带有超时的保留(而不是简单的保留),当超时发生时,服务器负责返回一个TIME_OUT。问题是,连接断开了(但TCP/IP直到任何一方尝试与另一端对话时才知道这一点),如果客户端阻止读取,它将永远不会返回。
该库似乎在本地支持某种超时(例如,当尝试连接到服务器时),但它似乎没有考虑到这种情况。
如何检测过时的连接并强制重新连接?协议(和pheanstalk本身)上是否有某种保持连接?
谢谢!
发布于 2012-10-25 14:04:24
您可以尝试在请求得到响应后立即关闭每个连接,然后每次重新打开一个新连接。
虽然没有close()函数,但使用unset($pheanstalk)删除Pheanstaly对象会将其关闭。
这个解释很有帮助:Pheanstalk (PHP client for beanstalk) - how do connections work?
发布于 2012-10-25 14:14:33
我还没有尝试过,但我想到了通过SSH隧道连接到beanstalk服务器的想法。我们可以在隧道上启用ServerAliveCountMax和ServerAliveInterval选项,这样网络或服务器故障就会导致隧道关闭。这将导致pheanstalk客户端报告错误。
https://stackoverflow.com/questions/11357983
复制相似问题