конерн производительности 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).

  • Обоснованно ли мое беспокойство?

    • Если да, то является ли решение для сна хорошим решением?

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

Author: The Surrican, 2011-08-02

1 answers

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

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

 4
Author: Daniel Stenberg, 2011-08-24 12:37:32