cURL и асинхронные запросы в PHP

В PHP, вы можете использовать cURL для выполнения псевдо асинхронных запросов, используя многопоточность или обработку множества запросов параллельно. Ниже приведены два примера, которые помогут вам понять, как это сделать.

Многопоточный асинхронный запрос с использованием многопоточности:

// Создаем массив cURL дескрипторов
$ch = array();

// Создаем массив URL для запросов
$urls = array(
    'https://example.com/endpoint1',
    'https://example.com/endpoint2',
    // Добавьте здесь дополнительные URL, если необходимо
);

// Инициализируем многопоточные запросы cURL
$mh = curl_multi_init();

foreach ($urls as $i => $url) {
    $ch[$i] = curl_init($url);
    curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch[$i]);
}

// Запускаем запросы асинхронно
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

// Получаем результаты запросов
foreach ($urls as $i => $url) {
    $response = curl_multi_getcontent($ch[$i]);
    // Здесь вы можете обработать результаты запросов
    echo "Response from $url: $response" . PHP_EOL;

    // Удаляем дескрипторы
    curl_multi_remove_handle($mh, $ch[$i]);
    curl_close($ch[$i]);
}

// Закрываем многопоточный дескриптор
curl_multi_close($mh);

Параллельный асинхронный запрос с использованием «curl_multi_init»:

// Создаем массив URL для запросов
$urls = array(
    'https://example.com/endpoint1',
    'https://example.com/endpoint2',
    // Добавьте здесь дополнительные URL, если необходимо
);

// Создаем массив для хранения дескрипторов cURL
$ch = array();

// Создаем массив для хранения результатов запросов
$responses = array();

// Инициализируем каждый запрос в отдельности и добавляем его в массив cURL дескрипторов
foreach ($urls as $i => $url) {
    $ch[$i] = curl_init($url);
    curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
}

// Создаем многопоточный дескриптор
$mh = curl_multi_init();

// Добавляем каждый запрос в многопоточный дескриптор
foreach ($ch as $handle) {
    curl_multi_add_handle($mh, $handle);
}

// Запускаем запросы параллельно
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

// Получаем результаты запросов
foreach ($ch as $i => $handle) {
    $responses[$i] = curl_multi_getcontent($handle);
    // Здесь вы можете обработать результаты запросов
    echo "Response from {$urls[$i]}: {$responses[$i]}" . PHP_EOL;

    // Удаляем дескрипторы
    curl_multi_remove_handle($mh, $handle);
}

// Закрываем многопоточный дескриптор
curl_multi_close($mh);

Обратите внимание, что во втором примере запросы выполняются параллельно, но не обязательно одновременно, в зависимости от того, какой сервер обрабатывает запросы и какой доступен интернет-канал. Однако такой подход позволяет минимизировать общее время выполнения запросов.