Как получить самый быстрый ответ от асинхронного http-клиента Guzzle в PHP

Я хочу использовать Guzzle для отправки HTTP-запросов на несколько конечных точек, и я хочу использовать ответ, который приходит первым, а не ждать завершения всех запросов.

Мой код:

    $client = new \GuzzleHttp\Client();

    $p1 = $client->requestAsync('GET', 'slow.host');
    $p2 = $client->requestAsync('GET', 'fast.host');

    $any = \GuzzleHttp\Promise\any([$p1, $p2]);
    $response = $any->wait();

Я ожидал, что как только любое из обещаний ($p1, $p2) будет разрешено, я получу ответ, однако с Guzzle это не так. Guzzle всегда будет ждать разрешения или отклонения $p1, даже если это займет вечность.

Из приведенного выше примера, если для отправки ответа slow.host требуется 10 секунд, а для отправки ответа fast.host требуется 1 секунда, мне все равно придется ждать 10 секунд. Я бы получил ответ от fast.host только в случае полного отказа slow.host (обещание отклонено, такого хоста нет и т. д.).

Как получить быстрый ответ сразу и игнорировать остальные?

Будет ли этот ответ достаточным решением для вас? stackoverflow.com/a/49502952/757587

ncla 15.07.2019 13:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение состоит в том, чтобы отменить оставшиеся запросы при получении первого ответа.

// Create your promises here.
// All the promises must use the same guzzle client!
$promises = create_requests(); 

$any = \GuzzleHttp\Promise\any($promises);

// when data is received from any of the requests:
$any->then(function() use ($promises) {
    // cancel all other requests without waiting for them to fulfill or reject
    foreach ($promises as $promise) {
        $promise->cancel();
    }
});

try {
    // this actually fires all the requests
    $data = $any->wait();
} catch (Exception $e) {
    // Exception will be thrown if ALL requests fail
    // Handle exception here
}

Другие вопросы по теме