2012-04-24 37 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