我使用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获得响应。
我如何才能使这项工作成为可以从及时返回的请求中获得有效回复?
答案 0 :(得分:5)
在我写完这个问题之前我找到了答案,但我想我还是会发布它,以防它帮助其他人。
解决方案是更换此电话:
$results = Promise\unwrap($promises);
有了这个:
$results = Promise\settle($promises)->wait(true);
如果拒绝承诺,settle
函数不会抛出异常,允许您获取完整的响应数组(包括已完成和已拒绝的响应)。