在我们开始下载响应之前,如何使用guzzle来检测我们将获得巨大的HTTP响应

时间:2016-08-18 02:45:34

标签: php guzzle

我们仍在使用传统的Guzzle 3.x。

我们需要不时地发送HTTP GET响应会员像素点火URL。

大多数情况下,我们期待一些kb文本回复。

但是,一些关联公司会向我们发送一个巨大的二进制文件,我们对此不感兴趣。

我们希望更早地检测到这种情况,甚至开始浪费时间下载不必要的二进制文件。

$url = 'http://speedtest.ftp.otenet.gr/files/test1Gb.db';

$client = new \Guzzle\Http\Client();

echo "1) Grab 1GB file...\n";

$s = $client->get($url,
    array(
        'timeout' => 5,         // Response timeout
        'connect_timeout' => 5, // Connection timeout
    )
);

echo "2) Grab 1GB file...\n";

// Code will "hang" here to wait 1GB file finished download.
$response = $s->send();

echo "Grab 1GB file done\n";

// Check if a header exists.
if ($response->hasHeader('Content-Length')) {
    $content_length = $response->getHeader('Content-Length');
    // If the response is too large, we will reject it.
}

因此,我们的代码将花费大量时间执行

$response = $s->send();

如果我们知道这个联盟会给我们发送一个不必要的1GB二进制文件,我们可以早点放弃。

我可以知道,有没有办法知道我们的回复规模,甚至在我们花时间开始下载不必要的巨大响应之前?

1 个答案:

答案 0 :(得分:2)

这不是一个直接的答案,但如果迁移到Guzzle 6,您将能够使用流媒体响应。

string[] seriesIIType = {"OC", "RH", "RC", "OA"};
foreach (var item in SomeCollection.Where(x => seriesIIType.Contains(x.Column)))
        {
        }

我认为Guzzle 3支持这样的事情,但我不确定。