2010-02-19 113 views
5

我正在使用'滾動'cURL多實現(如this SO post,基於this cURL code)。它可以同時處理數以千計的URL,最多可以使用100個請求,5個腳本作爲守護進程運行(我知道,這應該用C或其他語言編寫)。cURL多掛/忽略超時

下面是問題:在處理大約200,000個URL(跨越5個實例)之後,curl_multi_exec()似乎中斷了腳本的所有實例。我嘗試關閉腳本,然後重新啓動,並且發生同樣的事情(不是在20萬個URL之後,而是在重新啓動之後),腳本掛起呼叫curl_multi_exec()

我把腳本置於'single'模式,在一次處理一個常規的cURL句柄,並且工作正常(但它不是我需要的速度)。我的日誌記錄導致我懷疑它可能已經遇到了一些緩慢/有問題的連接(因爲每隔好幾次似乎在URL上處理然後再掛起),但是這意味着我的CURLOPT_TIMEOUT被單個句柄忽略。或者,也許這只是通過cURL運行許多請求而已。

有人聽說過這樣的事嗎?

示例代碼(同樣基於this):

//some logging shows it hangs right here, only looping a time or two 
//so the hang seems to be in the curl call 
while(($execrun = 
    curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM); 

//code to check for error or process whatever returned 

CURLOPT_TIMEOUT設置爲120,但在curl_multi_exec()終於返回一些數據的情況下,10分鐘後等待的。

我有一堆測試/檢查還沒有做,但也許這可能會與某人打鈴。

+0

通過重新啓動持續的掛起聽起來像是遠程服務器調節連接的問題。 – 2015-02-03 07:23:29

+0

在處理之前使用'shuffle()'來獲勝。 – 2017-01-16 22:49:05

回答

8

經過多次測試後,我相信我發現了導致這個問題的原因。我並不是說其他​​答案不正確,只是在這種情況下不是我遇到的問題。

從我所知道的,curl_multi_exec()不會返回,直到所有的DNS(失敗或成功)解決。如果有一羣不良域名的網址curl_multi_exec()不至少返回:

(time it takes to get resolve error) * (number of urls with bad domain) 

這裏是別人who has discovered this

就在上捲曲的多職能的異步特性注: DNS查找不是(據我所知現在)異步。因此,如果您的羣組的一個DNS查找失敗,那麼之後的URL列表中的所有內容也會失敗。我們實際上更新了我們的hosts.conf(我認爲?)文件在我們的服務器每天爲了解決這個問題。它獲取IP地址,而不是查看它們。我相信它正在努力,但不確定它是否在cURL中發生了變化。

此外,測試顯示cURL(至少我的版本)確實遵循CURLOPT_CONNECTTIMEOUT設置。當然,多循環的第一步可能需要很長時間,因爲cURL會等待每個url解析或超時。

6

我覺得你的問題是相關型號到:

(62)CURLOPT_TIMEOUT不與常規多和multi_socket接口正常工作。應用程序的解決方法是一旦時間到,簡單地刪除簡單的句柄。

參見:http://curl.haxx.se/bug/view.cgi?id=2501457

如果這是你應該看你的捲曲處理的超時,並從多池中刪除的情況。

+1

正是我在找的東西。將嘗試一些測試代碼,看看會發生什麼。 – 2010-02-19 22:38:32