Здравствуйте!
Необходимо сделать несколько асинхронных запросов и получить результаты. Пример из официальной документации Guzzle позволяет это сделать, но ожидание завершения всех запросов блокирует код. Можно ли сделать Promise на завершение всех запросов, чтобы wait() не блокировал код?
Пример:
<?php
set_time_limit(0);
date_default_timezone_set('UTC');
require __DIR__ . '/../vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
$client = new Client();
$requests = function ($total) {
$urls = [
'http://httpbin.org/get',
'http://httpbin.org/delay/2',
'http://httpbin.org/get',
];
foreach ($urls as $url) {
yield new Request('GET', $url);
}
};
$pool = new Pool($client, $requests(5), [
'concurrency' => 5,
'fulfilled' => function (Response $response, $index) {
echo $response->getStatusCode().PHP_EOL;
},
'rejected' => function (RequestException $reason, $index) {
// this is delivered each failed request
},
]);
// Initiate the transfers and create a promise
$promise = $pool->promise();
// Force the pool of requests to complete.
$promise->then(function(){
echo 'END!';
})->wait();
echo 'Этот echo должен появиться сразу, не дожидаясь завершения всех запросов';