2012-04-13 53 views
4

當我運行下面的代碼時,在我看來,curl_multi_selectcurl_multi_info_read是相互矛盾的。據我所知curl_multi_select應該是阻止的,直到curl_multi_exec有迴應,但我沒有看到實際發生。爲什麼curl_multi_select和curl_multi_info_read相互矛盾?

$url = "http://google.com"; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 

$mc = curl_multi_init(); 
curl_multi_add_handle($mc, $ch); 

do { 
    $exec = curl_multi_exec($mc, $running); 
} while ($exec == CURLM_CALL_MULTI_PERFORM); 

$ready=curl_multi_select($mc, 100); 
var_dump($ready); 

$info = curl_multi_info_read($mc,$msgs); 
var_dump($info); 

這將返回

int 1 
boolean false 

這似乎自相矛盾。它如何做好準備,沒有任何消息?

我使用的PHP版本是5.3.9

回答

5

基本上curl_multi_select塊,直到curl_multi_exec有東西要閱讀。如果你循環使用curl_multi_exec而不使用curl_multi_select這會佔用你100%的CPU。 因此curl_multi_info_read用於檢查是否有任何傳輸已結束(正確或有錯誤)。使用多手柄應遵循下列模式

代碼:

do 
{ 
    $mrc = curl_multi_exec($this->mh, $active); 
} 
while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) 
{ 
    curl_multi_select($this->mh); 
    do 
    { 
     $mrc = curl_multi_exec($this->mh, $active); 
    } 
    while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    while ($info = curl_multi_info_read($this->mh)) 
    { 
     $this->process_ch($info); 
    } 
} 

參見:Doing curl_multi_exec the right way

+0

奇怪。我之前有一個簡單的'curl_multi_exec()',其中有一個簡短的'usleep()',並且改變這種方法使獲取所有URL所花費的總時間增加了一倍,失敗的請求數增加了三倍,並且CPU使用率基本保持不變。 – 2013-04-02 22:14:21

0

spec

向多手柄是否有來自各個傳輸的任何消息或信息。消息中可能包含信息,例如來自傳輸的錯誤代碼或傳輸完成的事實。

1可能意味着有活動,但不一定是等待的消息:在這種情況下,可能有一些下載數據可用,但不是全部。 curl_multi_select文檔中的示例顯式測試從curl_multi_info_read返回的錯誤值。

+0

如果那是真的,那更令人困惑。爲什麼麻煩調用'curl_multi_select'呢?難道你只是循環curl_multi_info_read? – hadees 2012-04-13 22:43:59

+0

它在'curl_multi_select'而不是'curl_multi_info_read'中循環得多。 – Femi 2012-04-13 22:54:03

+1

如果它沒有實際阻止,直到有響應,則不應該。我必須打更多電話。在我註釋掉'curl_multi_select'之前,你鏈接的例子甚至都不適用於我。在這種情況下,它完美地工作。我仍然在爲'curl_multi_select'如何工作尋找一個很好的解釋,因爲坦率地說它沒有任何意義。阻止阻塞的其他活動究竟是什麼?如果那是真的,應該有辦法看到它。 – hadees 2012-04-13 23:02:42

相關問題