Использование обещаний Guzzle асинхронно

Я пытаюсь использовать жадные обещания чтобы сделать несколько http-вызовов, чтобы проиллюстрировать, что у меня есть, я привел этот простой пример, где поддельный http-запрос занял бы 5 секунд:

$then = microtime(true);

$promise = new Promise(
function() use (&$promise) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise->resolve($httpResponse);
});

$promise2 = new Promise(
function() use (&$promise2) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise2->resolve($httpResponse);
});

echo 'PROMISE_1 ' . $promise->wait();
echo 'PROMISE_2 ' . $promise2->wait();

echo 'Took: ' . (microtime(true) - $then);

Теперь я хотел бы запустить их обоих, а затем заставить оба эха ждать ответа. На самом деле происходит пожар обещания 1, ожидание 5 секунд, затем обещание огня 2 и ожидание еще 5 секунд.

Насколько я понимаю, я должен использовать ->resolve(); функция обещания, чтобы это началось, но я не знаю, как передать разрешение функции, в которой я бы сделал HTTP-вызов

3

Решение

Используя wait() вы заставляете обещание быть выполненным синхронно: https://github.com/guzzle/promises#synchronous-wait

Согласно ЧаВо ты должен использовать requestAsync() с вашими RESTful звонками:

Может ли Guzzle отправлять асинхронные запросы?

Да. Вы можете использовать requestAsync, sendAsync, getAsync, headAsync,
методы putAsync, postAsync, deleteAsync и patchAsync клиента
отправить асинхронный запрос. Клиент вернет
GuzzleHttp \ Promise \ PromiseInterface объект. Вы можете тогда
функционирует вне обещания.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode(); });

Вы можете принудительно завершить асинхронный ответ, используя wait ()
метод возвращенного обещания.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
4

Другие решения

Этот вопрос немного старый, но я не вижу ответа, поэтому я попробую, может быть, кто-то найдет его полезным.

Вы можете использовать функцию all($promises),

Я не могу найти документацию по этой функции, но вы можете найти ее реализацию Вот.

Комментарий над этой функцией начинается так:

Получив массив обещаний, верните обещание, которое выполняется, когда все элементы в массиве выполнены.

Похоже, что вы ищете, так что вы можете сделать что-то вроде этого:

$then = microtime(true);
$promises = [];

$promises[] = new Promise(
function() use (&$promise) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise->resolve($httpResponse);
});

$promises[] = new Promise(
function() use (&$promise2) {
//Make a request to an http server
$httpResponse = 200;
sleep(5);
$promise2->resolve($httpResponse);
});

all($promises)->wait();
echo 'Took: ' . (microtime(true) - $then);

Если эта функция не помогает решить вашу проблему, в этом файле есть и другие интересные функции, такие как some($count, $promises), any($promises) или же settle($promises),

1

По вопросам рекламы [email protected]