2011-03-28 46 views
4

我使用rolling-curl [https://github.com/LionsAd/rolling-curl]庫異步檢索大量Web資源中的內容,作爲一個計劃任務。該庫允許您設置併發CURL連接的最大數量,並且我從20開始,但後來升級到50以提高速度。cURL有時返回空白字符串作爲有效的URL

看來,我每次運行它,任意網站中的數千正在處理失敗,並返回一個空白字符串。看起來我擁有的併發連接越多,獲得的失敗請求就越多。下一次嘗試運行該功能時,一次失敗的相同網址可能會有效。有什麼可能導致這種情況,我該如何避免它?

+1

務必檢查您的CURL超時設置。 – DADU 2011-03-28 19:03:53

+0

當我添加VERBOSE選項時,似乎服務器正在爲某些請求返回空響應。 – MarathonStudios 2011-03-29 01:03:09

+1

你可以添加一些代碼,所以我們可以看到嗎? – Jaanus 2011-05-05 19:39:37

回答

0

一般而言,你認爲這不應該發生。

在訪問外部服務器的情況下,情況並非如此。您的代碼應完全瞭解可能無法響應的服務器,不能及時響應或響應錯誤。 HTTP過程允許事情發生錯誤。如果你到達服務器,你應該得到一個HTTP錯誤代碼的通知(雖然這不總是會發生),但網絡問題也可能不會產生或無用的響應。

不要相信外部輸入。這是問題的根源。

在您的具體情況下,您會一致地增加請求數量。這將創建更多的請求,打開套接字和其他用途。要找到確切問題的解決方案,您需要對服務器進行高級訪問,以便查看日誌文件並監視打開的連接和其他問題。最好在測試服務器上測試它,而不用任何其他軟件創建連接,以便您能夠找出問題。

但是,如果你做得很好,你只有不確定性。例如,由於請求太多,您可能會被外部服務器阻止。您可能會陷入一些安全過濾器,如DDOS過濾器等。請求數量(自動或手動)的監視和自定義將爲您生成最穩定的解決方案。您也可以接受這些丟失的請求,並處理一個穩定的隊列,以確保您在某個特定時間獲取內容。

1

一切呂克·弗蘭肯寫的是準確的,他的回答使我解決我的版本提問的問題,這就是:

遠程服務器上根據自己的,充滿變數,時間表作出迴應。爲了給他們足夠的時間做出響應,設置兩個cURL參數以提供大量時間非常重要。它們是:

CURLOPT_CONNECTTIMEOUT => 30 
    CURLOPT_TIMEOUT => 30 

您可以嘗試更長和更短的時間,直到找到最大限度地減少錯誤的東西。但是,如果你使用curl/multi-curl/rollingcurl獲得間歇性的非響應,那麼你很可能以這種方式解決大部分問題。

相關問題