使用curl和php保持与管道的活动连接

时间:2012-04-24 20:21:12

标签: php curl

我正在使用cURL连接到名为Gnip的公司管理的服务器。 (www.gnip.com) 最终我们想要无限期地使用管道json feed。

最初,当我设置我们的软件时,有一个很好的小类来保持连接;它是通过gnip社交提供的。

Gnip改变了他们要求连接的方式,因此课程破了。

我可以很好地连接到服务器。有时它会持续数天,有时连接会在几秒钟内消失。

一切应该工作的方式是:我连接到gnip并维持一个开放的连接。 gnip将数据作为json字符串直接发送给我(因为它们收到它)。如果在30秒内没有发送任何数据,他们会发送一个“保持活动”信号,让我的脚本知道它仍然连接。

理想情况下,只有当两个服务器中的一个关闭时,脚本才会断开连接。我已经通过cronjob处理了这个问题。

问题是连接有时会意外关闭。我联系了gnip,他们的日志说断开连接不是他们的错。

这完全超出了我的正常范围。我确定curl发送了某种错误,但我不知道如何找到它以便记录它。

以下是我到目前为止编写的代码的副本:http://pastebin.com/jpHzvbTF

我喜欢直接的“这就是你如何解决它”,但我也很想知道一些可以引导我自己解决方案的条款。

我已阅读Keep-alive in curl / php但我发现它与建议的时间不相关。

1 个答案:

答案 0 :(得分:2)

我为一家Gnip客户的公司工作,并使用您正在使用的相同产品。我们的代码是用Java而不是PHP,所以我可能无法为你提供很好的帮助,但这是我在使用这些feed时所发现的:

  1. Streaming HTTP并不是它的全部内容。在您所在的位置和Gnip的端点托管位置之间可能会出现很多问题。
  2. 您将需要构建逻辑来检测断开连接并尝试重新连接。同样,我不确定如何使用cURL和PHP来做到这一点。在Java中,对我们有用的是读取输入流上的超时和连接超时以强制异常,然后我们放弃连接并再试一次,但是你必须小心这些 - TCP读取超时太短了你经常重新连接,这会在Gnip的UI中产生非常奇怪的行为。但是,使用这样的东西可以让你捕捉到Gnip无法发送保持活动换行符并适当循环连接的状态。
  3. Gnip定期对其软件进行更新,并以其术语说明。在这些更新期间,他们可能会(将)断开您的连接,您将需要重新连接。除非它们有错误,否则这种丢弃通常会正确发出信号,并且不会让你的连接处于不良状态,所以无论你用什么来检测断开的连接都可以触发,你可以重新连接,一切都很好。
  4. 我希望能就如何使用您正在使用的特定技术处理您遇到的问题提供更好的建议。深入研究流式HTTP(或Keep-Alive HTTP会话),看看是否有任何问题。绝对弄清楚如何捕获任何味道的断开然后重新连接。

    Gnip已经开始建议人们实施重新连接退避逻辑,这意味着你的重新连接会立即开始,并且在每次连续失败时重新连接,等待n * 2< 10(比方说)秒,其中n是重试之前到目前为止的连接尝试次数。 Twitter自己要求将此作为其流媒体服务的一部分,而Gnip只是建议它(毕竟它是付费服务),但是如果你想让你的Gnip UI不会因为失败的尝试而变得混乱,我会推荐它。

    在大多数情况下,我对Gnip的体验非常好。但Streaming HTTP是一种非常不完美的技术(正如我们已经发现的那样)。这有点天真的想法,你可以连接一次,从此过上幸福的生活。我也认为,当我开始时会出现这种情况,现在我有点愤世嫉俗。如果我有我的druthers,我永远不会支持在Streaming HTTP之上构建的生产系统,其服务在我自己的网络之外。我更愿意获得FTP drop,因为所有这些都是你可能会谈论的那种卷的痛苦。不幸的是,它们不适用于该产品系列。

    祝你好运。