Guzzle Pool不尊重超时

时间:2017-06-25 19:06:14

标签: php asynchronous request timeout guzzle

我的guzzle客户端有些问题。我设置超时为例1.0,在某些路线我睡觉(5)。 Guzzle无论如何等待响应时应该抛出异常。 客户端:

$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 client做到了,但它不是我的解决方案,因为我需要针对特定​​请求的自定义超时,而不是客户端。

$this->client = new Client([
        'timeout'  => 3.0,
        'connect_timeout'  => 1.0
    ]);

2 个答案:

答案 0 :(得分:0)

我认为你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标头,而不是选项。

答案 1 :(得分:0)

构造timeout时,您应该通过Pool作为选择:

$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代码here的注释中找到了这一点。