Сколько раз должен вызываться curl_multi_exec? - PullRequest
2 голосов
/ 29 августа 2010

Я использую 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скручивать запрос?Нужно ли его вызывать для каждого небольшого количества передаваемых данных?Он использует много процессоров, и я думаю, что это потому, что он слишком занят.Так что я могу добавить сон (5);в конце каждого цикла, чтобы заставить его использовать меньше циклов ЦП, или это в основном замедлит запросы?

Я бы использовал curl_multi_select, но не могу, потому что обрабатывается несколько curl_multi_execs.

1 Ответ

2 голосов
/ 30 ноября 2010

curl_multi_exec () читает и записывает данные в сокет. Он останавливается, когда не может писать или читать. Таким образом, количество необходимых вызовов зависит от объема передаваемых данных и скорости сети. curl_multi_select () ожидает, пока сокет не станет доступным для чтения или записи.

Вы должны использовать curl_multi_select () и иметь все хосты внутри одного мульти-дескриптора. Проверьте curl_getinfo () или curl_multi_info_read () , если вам нужно знать продолжительность отдельных запросов.

...