【问题标题】:Decode gzipped web page retrieved via cURL in PHP解码通过 PHP 中的 cURL 检索到的 gzipped 网页
【发布时间】:2010-09-23 13:32:03
【问题描述】:

我正在通过 curl 检索 gzip 后的网页,但是当我将检索到的内容输出到浏览器时,我只获得了原始的 gzip 数据。如何在 PHP 中解码数据?

我发现的一种方法是将内容写入 tmp 文件,然后...

$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);

....但是,伙计,必须有更好的方法。

编辑:这不是文件,而是 Web 服务器返回的压缩后的 html 页面。

【问题讨论】:

  • 文件本身是压缩的,还是服务器压缩它以进行传输?
  • 不是解码 gzip 数据,您可以发送正确的标头以便浏览器正确识别吗?或者,如果您一开始就不想对其进行 gzip,请通过将 CURLOPT_ENCODING 设置为“identity”来告诉 cURL 不要要求 gzip 数据。

标签: php encoding gzip decoding


【解决方案1】:

我使用 curl 并且:

curl_setopt($ch, CURLOPT_ENCODING , "gzip");

【讨论】:

  • 请注意,此选项会在请求上设置Accept-Encoding: gzip 标头并且如果响应被压缩(可能不是),则解压缩响应,所以它确实是全部你需要做的。
  • CURL 的完美解决方案。
  • 将其设置为'gzip'始终发送Accept-Encoding: gzip,即使您的PHP 版本不支持解码gzip(然后您将获得压缩数据)。如果将其设置为''(空字符串),curl 将自动宣布并解码它支持的所有编码。
  • @AndreKR - 太棒了。只需在文档中阅读此内容“如果设置了空字符串“”,则会发送包含所有支持的编码类型的标头。”
【解决方案2】:

多功能 GUNZIP 功能:

函数 gunzip($zipped) { $偏移量 = 0; if (substr($zipped,0,2) == "\x1f\x8b") $偏移量 = 2; if (substr($zipped,$offset,1) == "\x08") { # file_put_contents("tmp.gz", substr($zipped, $offset - 2)); 返回 gzinflate(substr($zipped, $offset + 8)); } 返回“未知格式”; }

函数与 CURL 的集成示例:

$headers_enabled = 1; curl_setopt($c, CURLOPT_HEADER, $headers_enabled) $ret = curl_exec($c); 如果($headers_enabled){ # file_put_contents("preungzip.html", $ret); $sections = explode("\x0d\x0a\x0d\x0a", $ret, 2); while (!strncmp($sections[1], 'HTTP/', 5)) { $sections = explode("\x0d\x0a\x0d\x0a", $sections[1], 2); } $headers = $sections[0]; $data = $sections[1]; if (preg_match('/^Content-Encoding: gzip/mi', $headers)) { printf("找到 gzip 头\n"); 返回 gunzip($data); } } 返回 $ret;

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-12-12
    • 2014-02-24
    • 2012-05-17
    相关资源
    最近更新 更多