如何检测file_get_contents正在返回gzip压缩内容

时间:2018-05-11 15:56:57

标签: php http-headers gzip

我使用以下内容获取我网站上的视频网址。

$vid = 231231; 
$url = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/") 
echo $url ; 

请注意: $vid变量是动态的,有时会返回gziped个内容。

我已经知道我可以使用gzdecode函数解压缩这样的内容:

$vid = 231231; 
$url = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/") 
$decodeit = gzdecode($url);
echo $decodeit; 

现在,问题是我需要找到一种方法来解码$url变量,仅在需要时。通过" 需要",我的意思是:if {$url)它返回gziped内容,因为我需要使用相同的代码来相同的来源。

这可以做一些检查吗?怎么样?

2 个答案:

答案 0 :(得分:1)

您可以在$http_response_header

中查看内容类型或内容编码

答案 1 :(得分:1)

致电file_get_contents后,$http_response_header将返回响应标头,包括状态代码。

Content-Encoding标头指定使用了哪种编码,例如标头Content-Encoding: gzip将指定内容使用gzip进行编码。

所以我编写了一个函数来将头部映射到数组header name => value,然后检查Content-Encoding条目以确定是否使用gzip压缩响应。

从标题名称到值

创建地图
function transformIntoHeaderMap(array $headers)
{

摆脱状态标题(例如HTTP/1.1 200 OK),因为它不适合header name: value格式。

    $headersWithValues = array_filter($headers, function ($header) { return strpos($header, ':') !== false; });

现在将标题拆分为:,并将键和值写入地图。修剪值,摆脱开头/结尾的空格。

    $headerMap = [];
    foreach ($headersWithValues as $header) {
            list($key, $value) = explode(':', $header);
            $headerMap[$key] = trim($value);
    }

    return $headerMap;
}

确定内容是否为gzip压缩

检查标头是否已设置,然后检查它是否具有您要查找的值(gzip)。

function isGzipHeaderSet(array $headerMap)
{
    return isset($headerMap['Content-Encoding']) && 
        $headerMap['Content-Encoding'] == 'gzip';
}

解压缩内容(如果是gzip)

$vid = 231231; 
$contents = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/");
if (isGzipHeaderSet(transformIntoHeaderMap($http_response_header))) {
    $contents = gzdecode($contents);
}

echo $contents;

<强>替代

更简单的方法可能是使用array_search并直接查找Content-Encoding: gzip中的字符串$http_response_header。但我认为这种方法对于标题中的空格更加健壮。