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

ken*_*ske 4 php curl asynchronous guzzle

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请求1,2和3已启动
  • 请求2需要超过5秒,因此请求被取消,并且返回来自及时响应的请求1和3的响应

这是实际发生的事情: - 请求1,2和3启动 - 请求2需要超过3秒,因此解包函数抛出一个ConnectException,我无法从请求1和3获得响应.

我如何才能完成这项工作,以便能够及时获得有效回复?

ken*_*ske 6

在我写完这个问题之前我找到了答案,但我想我仍然会发布它,以防它帮助其他人.

解决方案是替换此调用:

$results = Promise\unwrap($promises);

有了这个:

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

settle如果拒绝承诺,该函数将不会抛出异常,允许您获取完整的响应数组(包括已完成和已拒绝的响应).

  • 当这个问题发布时,这个功能没有被记录,所以我是将它添加到文档中的人:D https://github.com/guzzle/guzzle/commit/812f3a83e5de84a089369ce07452fa9d45d2dd1d (2认同)