与Pheanstalk的陈旧连接

时间:2012-07-06 07:47:11

标签: beanstalkd pheanstalk

我正在使用beanstalkd将一些工作卸载到其他机器上。设置有点不寻常,服务器在互联网上(公共IP),但消费者在一些人家的广告线后面。因此,有一个Linux服务器作为客户端通过动态IP外出并连接到服务器以获得工作。这都是PHP而我正在使用pheanstalk库。

一切都运行平稳一段时间,但随后adsl更改了IP(提供商强制断开连接重新连接的每24小时)客户端挂起,永远不会退出“保留”。

我认为在保留区暂停会有所帮助,但事实并非如此。看起来,客户端发出命令和阻塞,它永远不会检查超时。它只发出一个超时保留(而不是一个简单的保留),服务器负责在超时发生时返回TIME_OUT。问题是,连接中断了(但TCP / IP直到任何一方都试图与另一方通话才知道这一点)如果客户端阻止读取,它将永远不会返回。

该库似乎在本地支持某种超时(例如,当尝试连接到服务器时),但它似乎没有考虑这种情况。

我如何检测陈旧连接并强制重新连接?协议(以及pheanstalk本身)是否存在某种保持活动?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试在应答请求后立即关闭每个连接,并每次重新打开新连接。

没有close()功能,但您使用unset($pheanstalk)删除Pheanstaly对象将关闭它。

这个解释非常有用: Pheanstalk (PHP client for beanstalk) - how do connections work?

答案 1 :(得分:0)

我还没有尝试过,但我想到了通过SSH隧道连接到beanstalk服务器的想法。我们可以在隧道上启用ServerAliveCountMaxServerAliveInterval选项,以便网络或服务器故障将导致隧道关闭。这应该会导致pheanstalk客户端报告错误。