2010-08-29 53 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()