我正在使用curl_multi和multi将文件上传到不同的服务器。每个服务器都有多个需要上传的文件,所以每个服务器都有一个curl_multi请求。当我执行curl_multi句柄时,我只是在同一个循环中执行所有curl_multi句柄,如下所示:
<?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实际上必须在curl请求中调用多少次?是否需要为每一小部分数据传输调用?它使用了很多cpu而我认为它因为它“繁忙的循环”太多了。所以我可以添加睡眠(5);在每个循环结束时使其使用较少的cpu周期,或者这会大大减慢请求的速度吗?
我会使用curl_multi_select,但我不能因为正在处理多个curl_multi_execs。
答案 0 :(得分:2)
curl_multi_exec()读取数据并将数据写入套接字。它无法写入或读取时停止。 因此,所需呼叫的数量取决于要传输的数据量和网络速度。 curl_multi_select()等待套接字变为可读或可写。
您应该使用curl_multi_select()并将所有主机放在一个多句柄中。 如果您需要知道各个请求的持续时间,请检查 curl_getinfo()或 curl_multi_info_read()。