我正在使用 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 获得响应。
我怎样才能使这项工作有效,以便我能够从及时返回的请求中获得有效响应?
最佳答案
我在写完问题之前就找到了答案,但我想我还是会发布它以防它能帮助到其他人。
解决方案是替换这个调用:
$results = Promise\unwrap($promises);
有了这个:
$results = Promise\settle($promises)->wait(true);
如果 promise 被拒绝,settle
函数将不会抛出异常,从而允许您获得完整的响应数组(包括已完成和已拒绝的响应)。
关于php - 如何使用 guzzle 发送具有超时限制的并发请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36347457/