@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. Затем он ждет завершения всех запросов и обрабатывает результаты.