Бывает нужно выполнять параллельные запросы к сайтам, это можно сделать с помощью библиотеки GuzzleHttp.
Установка
composer require guzzlehttp/guzzle:^7.0
Ниже привожу код скрипта, который выполняет параллельные запросы к домену по разным адресам. Каждая страница отвечает за разное время, это показывает последовательность ответов.
<?php require 'vendor/autoload.php'; $client = new \GuzzleHttp\Client([ 'base_uri' => 'http://localhost', ]); // Список адресов $urls = [ '/page.php?1', '/page.php?2', '/page.php?3', '/page.php?4', '/page.php?5', ]; $promises = []; foreach($urls as $urlIndex => $url) { $request = new \GuzzleHttp\Psr7\Request('GET', $url, []); echo date('d.m.Y H:i:s') . ' запрос ' . $url . PHP_EOL; $promises[$urlIndex] = $client->sendAsync($request, [ 'timeout' => 10, 'on_stats' => function (\GuzzleHttp\TransferStats $stats) use ($url) { // Тут можно получить статистику запроса $stat = $stats->getHandlerStats(); echo date('d.m.Y H:i:s') . ' получена статистика ' . $url . PHP_EOL; } ]); $promises[$urlIndex]->then( function (\Psr\Http\Message\ResponseInterface $res) use ($url) { // Тут обработка ответа echo date('d.m.Y H:i:s') . ' запрос выполнен ' . $url . PHP_EOL; }, function (\GuzzleHttp\Exception\RequestException $e) { // Тут обработка ошибки } ); } // Ждать ответов $results = \GuzzleHttp\Promise\Utils::settle($promises)->wait(true); // Обработка результатов по всем запросам if(sizeof($results) > 0) { foreach ($results as $urlIndex => $result) { // Обработка ответа по запросу $urls[$urlIndex] if ($result['state'] != 'fulfilled' || !isset($result['value'])) { // Если запрос выполнился с ошибкой continue; } /** @var \GuzzleHttp\Psr7\Response $response */ $response = $result['value']; // Получение заголовков // $response->getHeaderLine('Content-Length'); // Обработка тела ответа $body = $response->getBody(); echo date('d.m.Y H:i:s') . ' обработка запроса в цикле' . $urls[$urlIndex] . PHP_EOL; } }
Результат работы скрипта
Видно, что страница page.php отвечает за разное время, поэтому результаты приходят не последовательно.
14.08.2021 18:08:50 запрос /page.php?1 14.08.2021 18:08:50 запрос /page.php?2 14.08.2021 18:08:50 запрос /page.php?3 14.08.2021 18:08:50 запрос /page.php?4 14.08.2021 18:08:50 запрос /page.php?5 14.08.2021 18:08:52 получена статистика /page.php?5 14.08.2021 18:08:52 запрос выполнен /page.php?5 14.08.2021 18:08:54 получена статистика /page.php?1 14.08.2021 18:08:54 получена статистика /page.php?2 14.08.2021 18:08:54 получена статистика /page.php?4 14.08.2021 18:08:54 запрос выполнен /page.php?1 14.08.2021 18:08:54 запрос выполнен /page.php?2 14.08.2021 18:08:54 запрос выполнен /page.php?4 14.08.2021 18:08:56 получена статистика /page.php?3 14.08.2021 18:08:56 запрос выполнен /page.php?3 14.08.2021 18:08:56 обработка запроса в цикле/page.php?1 14.08.2021 18:08:56 обработка запроса в цикле/page.php?2 14.08.2021 18:08:56 обработка запроса в цикле/page.php?3 14.08.2021 18:08:56 обработка запроса в цикле/page.php?4 14.08.2021 18:08:56 обработка запроса в цикле/page.php?5
Оставить комментарий