2010-08-29 91 views
2

我使用curl_multi和multi來上傳文件到不同的服務器。每個服務器都有多個需要上傳的文件,所以我對每個服務器都有一個curl_multi請求。當我執行curl_multi把手,我只是執行所有的curl_multi在同一個循環來處理,就像這樣:curl_multi_exec必須被調用多少次?

<?php 
do { 

$continue_running=false; 

foreach($handles as $host => $handle) { 

    if(!is_resource($handle[0])) { 
    die("\nHandle is not a resource!\n"); 
    } 

    if($running_{$host}) { 
    if(curl_multi_exec($handles[$host][0], $running_{$host}) != CURLM_OK) { 
    die("\ncurl_multi_exec failed!\n"); 
    } 
    $continue_running=true; 
    } 

    if(!$running_{$host} && !$done_{$host}) { 
    echo "$host finished in ".(microtime(1)-$start)." seconds\n"; 
    $done_{$host}=true; 
    } 
} 

} while ($continue_running); 
?> 

我想知道是,是否curl_multi_exec實際上有多少次在一個捲曲的請求被稱爲?是否需要傳輸每一點數據?它使用了很多CPU,我認爲它是因爲它的「繁忙循環」太多。所以我可以加睡覺(5);在每個循環結束時使它使用更少的cpu週期,還是這會大大減緩請求的速度?

我會使用curl_multi_select,但我不能因爲正在處理多個curl_multi_execs。

回答

2

curl_multi_exec()讀取和寫入數據到套接字。它無法寫入或讀取時停止。 因此,所需的呼叫數量取決於要傳輸的數據量和網絡的速度。 curl_multi_select()等待一個套接字變爲可讀或可寫。

您應該使用curl_multi_select()並將所有主機放在一個多手柄內。 如果您需要知道單個請求的持續時間,請檢查curl_getinfo()curl_multi_info_read()