2012-04-24 38 views
1

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

最初当我安装我们的软件时,有一个很好的小类用于维护连接;它是通过gnip通过社交活动提供的。

Gnip改变了他们要求完成连接的方式,以至于班级破裂。

我可以连接到服务器就好了。有时它会保持开放几天,有时连接会在几秒钟内死亡。

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

理想情况下,脚本只会在两台服务器中的一台关闭时断开连接。我已经通过cronjob处理了我的结论。

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

这一切都超出了我的正常境界。我确定curl发送了某种错误,但我不知道如何找到它以记录它。

这是迄今为止我所编写的代码的副本:http://pastebin.com/jpHzvbTF

我喜欢直接“这里是你如何解决它”,但我也很想知道一些术语阅读起来这可能会导致我自己的解决方案。

我读过Keep-alive in curl/php,但是我发现它与建议的时间没有关系。

回答

2

我为一家Gnip客户的公司工作,并使用与您使用的产品相同的产品。我们的代码是用Java编写的,而不是PHP,所以我可能无法对你有很大帮助,但这是我在使用这些Feed时发现的内容:

  1. 流式传输HTTP并不完全是它被破解的。在Gnip的端点托管的位置和地点之间可能会出现很多问题。
  2. 您将需要构建逻辑来检测断开连接并尝试重新连接。再次,我不知道你将如何使用cURL和PHP来做到这一点。在Java中,对我们来说有效的是读取输入流超时和连接超时以强制异常,于是我们放弃连接并再次尝试,但是你必须小心这些 - 太简短的TCP读取超时将会看到你不断重新连接,这在Gnip的用户界面中产生非常奇怪的行为。然而,使用类似这样的东西可以让你捕捉Gnip未能发送保持活动的新行并适当循环连接的状态。
  3. Gnip会定期更新他们的软件并在其条款中说明这一点。在这些更新期间,他们可能(会)放弃您的连接,并且您将需要重新连接。除非它们有错误,否则这种丢弃通常会发出正确信号,并且不会使您的连接处于不良状态,因此,无论您用于检测丢弃的连接是否可以触发,都可以重新连接,并且一切正常。

我希望我可以给你更好的建议,就如何处理你使用的特定技术看到的问题。深入研究流式HTTP(或Keep-Alive HTTP会话),看看它是否让你无所适从。绝对找出如何捕获任何味道的断开,然后重新连接。

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

大部分情况下,我在Gnip上的体验都很不错。但Streaming HTTP是一种非常不完善的技术(正如我们已经发现的那样)。有一种天真的想法,你可以连接一次,并从此过上幸福的生活。我也是,当我开始的时候就认为是这样,现在我有点愤世嫉俗。如果我有我的druthers,我绝不会支持在Streaming HTTP之上构建的生产系统,它的服务在我自己的网络之外。我宁愿得到FTP下载,尽管在你可能谈论的各种卷中,这对你来说都是一种痛苦。不幸的是,它们不适用于该产品系列。

祝你好运。

+1

这是一个美好的回答!谢谢。我们通过说服老板说团队拥有更多的Python体验,并且需要将我们的整个平台从php更改为python,从而解决了我们的麻烦。我会鼓励任何寻找类似解决方案的人遵循此建议。我们基本上在fuerve的团队在Java中做了同样的事情。我相信它通常主要适用于HTTP请求。 – Jake 2012-07-09 04:35:07