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需要超过3秒,因此解包函数抛出一个ConnectException,我无法从请求1和3获得响应.
我如何才能完成这项工作,以便能够及时获得有效回复?
在我写完这个问题之前我找到了答案,但我想我仍然会发布它,以防它帮助其他人.
解决方案是替换此调用:
$results = Promise\unwrap($promises);
有了这个:
$results = Promise\settle($promises)->wait(true);
settle如果拒绝承诺,该函数将不会抛出异常,允许您获取完整的响应数组(包括已完成和已拒绝的响应).