Guzzle Pool:如何在没有超时的情况下等待所有请求完成?

问题描述 投票:0回答:1

在过去的6个月里,我使用Guzzle Pool从外部服务器请求数据(每个请求约1-2 MB)。我一次做5个同时请求。然而,事情发生了变化,外部服务器似乎过载,因此变得非常缓慢。有时它非常快1-2秒,但很多时候服务器需要等待2分钟以上的每个请求。

但这应该不是问题。但是现在(因为它发出请求变慢),我在池中的一些请求返回错误:

cURL error 18: transfer closed with outstanding read data remaining

通常在等待2分钟后就会这样做。

有趣的是,如果我通过Postman(例如)发出请求,那么我还是要等2-3分钟,但最后得到了回复。

所以这让我相信Guzzle在2分钟后阻止了请求。但是,我找不到任何设置来改变它。我甚至尝试发送Keep AliveContent-Length标题,但它们不起作用(也许我没有正确使用它们)。

这是我当前代码执行Guzzle Pool请求的一部分。 (我使用的是PHP 7.1,Guzzle 6.3和Laravel 5.7)。

$headers = ['Authorization' => 'Bearer ' . $token];

$client  = new Client();

$requests = function ($urls, $headers)
{
    foreach ($urls as $key => $url)
    {
        yield new Requests('GET', $url, $headers);
    }
};

$pool = new Pool($client, $requests($urls, $headers),
[
    'concurrency' => 5,
    'fulfilled'   => function ($response, $index)
    {
        echo 'fulfilled -> ' . $index;
    },
    'rejected' => function ($reason, $index)
    {
        echo 'rejected -> ' . $index . ' -> error:' . $reason->getMessage();
    },
]);

$promise = $pool->promise();
$promise->wait();

不幸的是,我无法共享外部服务器URL,因为它是私有的。

我在这里做错了什么,不允许请求等待它完成/发送数据?


更新:我已经尝试了@Alexey Shokov的推荐,摆脱了被拒绝的状态。请求现在不会在2分钟超时。但是,一旦我从以前的timed out来源获得回复,我就会得到null作为回应。

php curl guzzle guzzlehttp
1个回答
1
投票

看起来服务器端存在问题。该错误表明cURL客户端发现服务器发送的预期响应大小与实际响应大小不匹配。

看看this SO topic,同样的问题。我认为值得尝试将HTTP版本设置为1.0,如与Guzzle's version option的讨论中所述或直接在Request对象(yield new Requests('GET', $url, $headers, null, '1.0'))中所述。

© www.soinside.com 2019 - 2024. All rights reserved.