Производительность curl_multi_exec - PullRequest
2 голосов
/ 02 августа 2011

Следующий пример взят из:

http://php.net/manual/en/function.curl-multi-close.php#example-3540

В этом примере будут созданы два маркера cURL, добавлены их в мульти-дескриптор, а затем запустите их параллельно.

<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//create the multiple cURL handle
$mh = curl_multi_init();

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$running=null;
//execute the handles
do {
    curl_multi_exec($mh,$running);
} while ($running > 0);

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>

Я немного скорректировал его, чтобы удовлетворить свои потребности. Я хочу вызвать только один ресурс, но выполнить локальный код, пока он запрашивается. Это работает просто отлично, и моя проблема производительности также действительна для примера без изменений.

Я создал ресурсы, для доставки которых потребовалось 5 секунд, и использовал их как $ ch1 и $ ch2

Как и ожидалось, полное выполнение заняло всего 5 секунд вместо 10.

Но в цикле do я добавил небольшой счетчик, который показал, что curl_multi_exec и, соответственно, цикл do выполняются ~ 5000000 раз на моей локальной машине в течение ~ 5 секунд. Это будет примерно один прогон в микросекунду, что на самом деле довольно много.

Я обеспокоен тем, что это занимает значительные ресурсы ЦП, просто ожидая завершения запросов и в основном ничего не делая.

Я вспомнил, что одним из первых вещей, которые я изучил на курсе Java, было избегать бесконечных циклов и вместо этого работать со сном / прерываниями Thread по причинам, указанным выше.

Однако у нас здесь нет потоков, и я не знаю, подходит ли это и для PHP.

Поскольку это официальный пример, я подумал, что лучше сначала спросить здесь экспертов.

Я думал о реализации короткого сна в цикле do. Что-то вроде usleep(100).

  • Является ли мое беспокойство действительным?

    • Если да, то хороший ли это сон?

      • Если это так, что будет хорошим интервалом сна? Мне бы хотелось, чтобы что-то было как можно меньше, чтобы ни один процесс не замедлился, но я также не хочу забивать сервер.
    • Если нет, то почему?

1 Ответ

4 голосов
/ 24 августа 2011

Ваша программа зацикливается как сумасшедший, как это, потому что curl_exec_multi () всегда будет выполняться и пытаться что-то делать, и ваша программа не будет соответственно ждать, пока что-то продолжит действовать, прежде чем вы вызовете это снова.

См. curl_multi_select для функции PHP, которая явно создана для этой цели и должна решить вашу проблему.

...