30.06.2020 17:40 09.07.2020 12:35

Получение ответов по нескольким URL-адресам в PHP с помощью multi-cURL

Получение ответов по нескольким URL-адресам в PHP с помощью multi-cURL

В этой статье я приведу пример того, как получить ответы по нескольким URL-адресам в PHP с помощью multi-cURL. Вы можете выполнять несколько запросов одновременно в асинхронном режиме. В обычном режиме выполнение нескольких запросов занимает много времени, потому что они выполняются последовательно один за другим. Но вы можете ускорить этот процесс, используя асинхронное выполнение запросов. Используйте эту функцию для получения ответов по нескольким URL-адресам:

function getResponseByUrlsMulti($urls, $followLocation = false, $maxRedirects = 10)
{
    // Options
    $curlOptions = [
        CURLOPT_HEADER => false,
        CURLOPT_NOBODY => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_CONNECTTIMEOUT => 10,
    ];

    if ($followLocation) {
        $curlOptions[CURLOPT_FOLLOWLOCATION] = true;
        $curlOptions[CURLOPT_MAXREDIRS] = $maxRedirects;
    }

    // Init multi-curl
    $mh = curl_multi_init();
    $chArray = [];

    $urls = !is_array($urls) ? [$urls] : $urls;
    foreach ($urls as $key => $url) {
        // Init of requests without executing
        $ch = curl_init($url);
        curl_setopt_array($ch, $curlOptions);

        $chArray[$key] = $ch;

        // Add the handle to multi-curl
        curl_multi_add_handle($mh, $ch);
    }

    // Execute all requests simultaneously
    $active = null;
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active && $mrc == CURLM_OK) {
        // Wait for activity on any curl-connection
        if (curl_multi_select($mh) === -1) {
            usleep(100);
        }

        while (curl_multi_exec($mh, $active) == CURLM_CALL_MULTI_PERFORM);
    }

    // Close the resources
    foreach ($chArray as $ch) {
        curl_multi_remove_handle($mh, $ch);
    }
    curl_multi_close($mh);

    // Access the results
    $result = [];
    foreach ($chArray as $key => $ch) {
        // Get response
        $result[$key] = curl_multi_getcontent($ch);
    }

    return $result;
}

После вызова этой функции вы получите массив с ответами:

print_r(getResponseByUrlsMulti(['https://www.example.com', 'https://www.example.org']));

Вы также можете получить ответы по нескольким URL-адресам в PHP с использованием многопоточности cURL. Это улучшенное решение, которое позволяет избежать 100% загрузки процессора и должно обрабатывать большое количество URL-адресов.

Другие статьи