@camren
Существует несколько способов сделать параллельные HTTP запросы в PHP, но одним из наиболее эффективных и широко используемых является использование многопоточности и библиотеки cURL.
Пример кода, который позволяет делать несколько параллельных запросов с помощью библиотеки cURL, выглядит примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// список URL-адресов, к которым нужно отправить запросы $urls = array( 'http://example.com', 'http://google.com', 'http://yahoo.com', 'http://bing.com' ); // создание мультиручки cURL $mh = curl_multi_init(); // создание массива дескрипторов cURL $curl_handles = array(); // создание и настройка каждого дескриптора cURL foreach($urls as $url) { $curl_handles[] = get_curl_handle($url); } // добавление каждого дескриптора cURL в мультиручку foreach($curl_handles as $ch) { curl_multi_add_handle($mh, $ch); } // выполнение запросов параллельно $running = null; do { curl_multi_exec($mh, $running); } while($running > 0); // обработка результатов каждого запроса foreach($curl_handles as $ch) { // обработка ответа // удаление дескриптора cURL из мультиручки curl_multi_remove_handle($mh, $ch); } // закрытие мультиручки cURL curl_multi_close($mh); // функция для создания и настройки дескриптора cURL для конкретного URL-адреса function get_curl_handle($url) { $ch = curl_init($url); // настройка опций cURL для текущего URL-адреса return $ch; } |
Этот код создает мультиручку cURL, создает дескрипторы cURL для каждого URL-адреса, добавляет их в мультиручку и выполняет запросы параллельно. Затем код обрабатывает результаты каждого запроса и заканчивает работу.
@camren
Еще один способ сделать параллельные HTTP запросы в PHP - использовать библиотеку Guzzle. Guzzle предоставляет удобный API для работы с HTTP запросами и позволяет легко делать множество запросов параллельно.
Пример кода с использованием библиотеки Guzzle для параллельных HTTP запросов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
require 'vendor/autoload.php'; // Подключаем автозагрузчик composer
use GuzzleHttpClient;
use GuzzleHttpPromise;
// Создаем HTTP клиент Guzzle
$client = new Client();
// Список URL-адресов
$urls = array(
'http://example.com',
'http://google.com',
'http://yahoo.com',
'http://bing.com'
);
// Создаем массив промисов для параллельных запросов
$promises = [];
foreach ($urls as $url) {
$promises[$url] = $client->getAsync($url);
}
// Ждем завершения всех запросов
$results = Promisesettle($promises)->wait();
// Обрабатываем результаты каждого запроса
foreach ($results as $url => $result) {
if ($result['state'] === 'fulfilled') {
// Обработка успешного ответа
echo 'Response from ' . $url . ': ' . $result['value']->getBody() . PHP_EOL;
} else {
// Обработка ошибки
echo 'Error making request to ' . $url . PHP_EOL;
}
}
|
Этот код использует Guzzle для создания массива промисов, каждый из которых представляет запрос к конкретному URL. Затем он ждет завершения всех запросов и обрабатывает результаты.