Следующий пример взят из:
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)
.