在过去的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 Alive
和Content-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作为回应。
看起来服务器端存在问题。该错误表明cURL客户端发现服务器发送的预期响应大小与实际响应大小不匹配。
看看this SO topic,同样的问题。我认为值得尝试将HTTP版本设置为1.0,如与Guzzle's version
option的讨论中所述或直接在Request
对象(yield new Requests('GET', $url, $headers, null, '1.0')
)中所述。