Калининград+7.962.2626.555

CURL мультизапросы

11.10.2013

Прежде всего нужно упомянуть про простейшую деталь: мультиCURL — это набор простых CURL-дескрипторов.

Это значит, что перед отправкой мультизапроса нужно создать и настроить каждый CURL-запрос по отдельности.

$arrayCurlHandlers[0] = curl_init();
curl_setopt_array($arrayCurlHandlers[0], array(
    CURLOPT_URL => 'http://...',
    CURLOPT_POSTFIELDS => '...',
    CURLOPT_HTTPHEADER => '...',
    [ПРОЧИЕ CURL-ПАРАМЕТРЫ],
)

curl_setopt_array($arrayCurlHandlers[1], array(
    CURLOPT_URL => 'http://...',
    CURLOPT_POSTFIELDS => '...',
    CURLOPT_HTTPHEADER => '...',
    [ПРОЧИЕ CURL-ПАРАМЕТРЫ],
)

curl_setopt_array($arrayCurlHandlers[2], array(
    CURLOPT_URL => 'http://...',
    CURLOPT_POSTFIELDS => '...',
    CURLOPT_HTTPHEADER => '...',
    [ПРОЧИЕ CURL-ПАРАМЕТРЫ],
)

Сейчас у нас есть 3 CURL-дескриптора, находящихся в массиве $arrayCurlHandlers[].

Далее создаем мультидескриптор:

$multiHandler = curl_multi_init();

Теперь добавляем в только что созданный мультидескриптор созданные ранее три CURL-дескриптора:

curl_multi_add_handle($multiHandler,$arrayCurlHandlers[0]);
curl_multi_add_handle($multiHandler,$arrayCurlHandlers[1]);
curl_multi_add_handle($multiHandler,$arrayCurlHandlers[2]);

Теперь отправляем мультизапрос, используя такую вот конструкцию:

do {
    curl_multi_exec($multiHandler, $running);
    curl_multi_select($multiHandler);
} while ($running > 0);

Функция curl_multi_select() блокирует дальнейшее выполнение скрипта и ждет активности на любом CURL-соединении.

Теперь остается только прочитать полученный ответ по всем запросам:

$arrayContent[0] = curl_multi_getcontent($arrayCurlHandlers[0]);
$arrayContent[1] = curl_multi_getcontent($arrayCurlHandlers[1]);
$arrayContent[2] = curl_multi_getcontent($arrayCurlHandlers[2]);

Собственно все.