конерн производительности curl multi exec
Следующий пример взят из:
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, заключалась в том, чтобы избегать бесконечных циклов и вместо этого работать со спящими/прерывающимися потоками по причинам, указанным выше.
Однако у нас здесь нет потоков, и я не знаю, справедливо ли это и для PHP.
Поскольку это официальный пример, я подумал, что лучше сначала спросить экспертов здесь.
Я думал о реализация короткого сна в цикле do. Что-то вроде usleep(100)
.
-
Обоснованно ли мое беспокойство?
-
Если да, то является ли решение для сна хорошим решением?
- Если да, то каков был бы хороший интервал сна? Я бы хотел что-то как можно меньшее, чтобы процесс не замедлялся, но я также не хочу забивать сервер.
Если нет, то почему?
-
1 answers
Ваша программа зацикливается как сумасшедшая, потому что curl_exec_multi() всегда будет выполняться и пытаться что-то сделать, и ваша программа соответственно не ждет, пока что-то будет действовать, прежде чем вы вызовете его снова.
Смотрите curl_multi_select для функции PHP, которая явно создана для этой цели и должна решить вашу проблему.