curl_multi_exec必须被调用多少次?

时间:2010-08-29 16:42:04

标签: php curl curl-multi

我正在使用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。

1 个答案:

答案 0 :(得分:2)

curl_multi_exec()读取数据并将数据写入套接字。它无法写入或读取时停止。 因此,所需呼叫的数量取决于要传输的数据量和网络速度。 curl_multi_select()等待套接字变为可读或可写。

您应该使用curl_multi_select()并将所有主机放在一个多句柄中。 如果您需要知道各个请求的持续时间,请检查 curl_getinfo() curl_multi_info_read()