如何使用 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耗时超过5秒,取消请求,返回及时响应的请求1和3的响应
这是实际发生的事情:
- 请求 1、2 和 3 已启动
- 请求 2 花费了超过 3 秒,所以解包函数抛出一个 ConnectException
并且我无法从请求 1 和 3 获得响应。
我怎样才能完成这项工作,以便我可以从及时返回的请求中获得有效响应?
我在写完问题之前找到了答案,但我想我还是会 post 它以防它能帮助别人。
解决方案是替换此调用:
$results = Promise\unwrap($promises);
有了这个:
$results = Promise\settle($promises)->wait(true);
如果承诺被拒绝,settle
函数将不会抛出异常,从而允许您获得完整的响应数组(包含已完成和已拒绝的响应)。
我正在使用 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 获得响应。
我怎样才能完成这项工作,以便我可以从及时返回的请求中获得有效响应?
我在写完问题之前找到了答案,但我想我还是会 post 它以防它能帮助别人。
解决方案是替换此调用:
$results = Promise\unwrap($promises);
有了这个:
$results = Promise\settle($promises)->wait(true);
如果承诺被拒绝,settle
函数将不会抛出异常,从而允许您获得完整的响应数组(包含已完成和已拒绝的响应)。