@GilbertAmethyst

Как не блокировать пул запросов в Guzzle?

Здравствуйте!

Необходимо сделать несколько асинхронных запросов и получить результаты. Пример из официальной документации 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 должен появиться сразу, не дожидаясь завершения всех запросов';
  • Вопрос задан
  • 262 просмотра
Пригласить эксперта
Ответы на вопрос 2
Surzhikov
@Surzhikov
Разработчик
GilbertAmethyst привет. Ты нашел решение этого вопроса?
Ответ написан
Комментировать
@marenkov
// Initiate the transfers and create a promise
$promise = $pool->promise();

echo 'Этот echo должен появиться сразу, не дожидаясь завершения всех запросов';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы