Я хочу использовать 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 (обещание отклонено, такого хоста нет и т. д.).
Как получить быстрый ответ сразу и игнорировать остальные?






Решение состоит в том, чтобы отменить оставшиеся запросы при получении первого ответа.
// 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
}
Будет ли этот ответ достаточным решением для вас? stackoverflow.com/a/49502952/757587