0

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

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

我认为对储备设置超时会有所帮助,但事实并非如此。看起来,客户端发出命令并阻止,它从不检查超时。它只是发出一个带有超时的保留(而不是简单的保留),并且服务器有责任在超时发生时返回一个 TIME_OUT。问题是,连接断开了(但 TCP/IP 直到任何一方尝试与另一方交谈才知道这一点),如果客户端阻止读取,它将永远不会返回。

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

我怎样才能检测到陈旧的连接并强制重新连接?协议(以及 pheanstalk 本身)上是否有某种保活?

谢谢!

4

2 回答 2

1

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

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

这个解释很有帮助: Pheanstalk(beantalk 的 PHP 客户端)- 连接如何工作?

于 2012-10-25T06:04:24.177 回答
0

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

于 2012-10-25T06:14:32.863 回答