2

我正在使用 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,我认为这是因为它的“忙循环”太多了。那么我可以添加 sleep(5); 在每个循环结束时使其使用更少的 cpu 周期,或者这会大大减慢请求吗?

我会使用 curl_multi_select,但我不能,因为正在处理多个 curl_multi_execs。

4

1 回答 1

2

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

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

于 2010-11-30T11:43:47.330 回答