我的guzzle客户端有一些问题。我设置了例如1.0的超时,在某些路线中我确实睡觉(5(。无论如何,都要等待响应,什么时候应该引发异常。客户:
$requests[] = new Request('GET', $path, [
'timeout' => 1,
'connect_timeout' => 1
]);
$pool = new Pool($this->client, $requests, [
'concurrency' => 5,
'fulfilled' => function ($response, $index) use ($response_merger) {
$response_merger->fulfilled($response);
},
'rejected' => function ($reason, $index) use ($response_merger) {
$response_merger->error($reason);
}
]);
和我的路线延迟:
$app->get('/timeout', function() use ($app) {
sleep(5);
return (new JsonResponse())->setData([ 'error' => 'My timeout exception.' ])->setStatusCode(504);
});
我总是得到504的超时例外,因为设置了超时。
我使用set客户端做到了,但这不是我的解决方案,因为我需要特定请求的自定义超时,而不是客户端。
$this->client = new Client([
'timeout' => 3.0,
'connect_timeout' => 1.0
]);
在构造Pool
时,您应该将timeout
作为选项传递:
$pool = new Pool($this->client, $requests, [
'concurrency' => 5,
'options' => ['timeout' => 10],
'fulfilled' => function ($response, $index) use ($response_merger) {
$response_merger->fulfilled($response);
},
'rejected' => function ($reason, $index) use ($response_merger) {
$response_merger->error($reason);
}
]);
在此处的Pool
代码的评论中找到了这一点。
我认为您对new Request()
有错误的签名。从文档中:
// Create a PSR-7 request object to send
$headers = ['X-Foo' => 'Bar'];
$body = 'Hello!';
$request = new Request('HEAD', 'http://httpbin.org/head', $headers, $body);
第三个参数用于HTTP标头,而不是选项。