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

时间:2016-04-01 03:22:35

标签: 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;
}

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

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

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

我如何才能使这项工作成为可以从及时返回的请求中获得有效回复?

1 个答案:

答案 0 :(得分:5)

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

解决方案是更换此电话:

$results = Promise\unwrap($promises);

有了这个:

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

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