В 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);
Обратите внимание, что во втором примере запросы выполняются параллельно, но не обязательно одновременно, в зависимости от того, какой сервер обрабатывает запросы и какой доступен интернет-канал. Однако такой подход позволяет минимизировать общее время выполнения запросов.