如何使用 guzzle 发送具有超时限制的并发请求?

How can I use guzzle to send concurrent requests with timeout limits?

我正在使用 Guzzle 6 发送这样的并发请求:

public function sendConcurrentRequests() {

    $client = new Client(['timeout' => 5]);

    $promises[] = $client->getAsync('http://example.com/1');
    $promises[] = $client->getAsync('http://example.com/2');
    $promises[] = $client->getAsync('http://example.com/3');

    $results = Promise\unwrap($promises);  

    return $results;
}

每个请求可能需要 1 到 10 秒,但我不希望任何请求等待超过 5 秒(这就是我设置超时的原因)。我希望发生的是:

这是实际发生的事情: - 请求 1、2 和 3 已启动 - 请求 2 花费了超过 3 秒,所以解包函数抛出一个 ConnectException 并且我无法从请求 1 和 3 获得响应。

我怎样才能完成这项工作,以便我可以从及时返回的请求中获得有效响应?

我在写完问题之前找到了答案,但我想我还是会 post 它以防它能帮助别人。

解决方案是替换此调用:

$results = Promise\unwrap($promises);

有了这个:

$results = Promise\settle($promises)->wait(true);

如果承诺被拒绝,settle 函数将不会抛出异常,从而允许您获得完整的响应数组(包含已完成和已拒绝的响应)。