在PHP中解码通过cURL检索的gzip网页

vuv7lop3  于 2023-01-16  发布在  PHP
关注(0)|答案(2)|浏览(136)

我正在通过curl检索一个gzip格式的网页,但是当我把检索到的内容输出到浏览器时,我只得到了原始的gzip格式的数据。我该如何用PHP解码这些数据呢?
我发现的一个方法是将内容写入一个临时文件,然后...

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

......但是伙计,肯定有更好的办法。
编辑:这不是一个文件,而是一个由web服务器返回的gzip格式的html页面。

aydmsdu9

aydmsdu91#

以下命令启用cURL的“自动编码”模式,在该模式下,它将向服务器宣布它支持哪些编码方法(通过Accept-Encoding头),然后自动解压缩响应:

// Allow cURL to use gzip compression, or any other supported encoding
// A blank string activates 'auto' mode
curl_setopt($ch, CURLOPT_ENCODING , '');

如果您特别希望强制标头为Accept-Encoding: gzip,则可以改用以下命令:

// Allow cURL to use gzip compression, or any other supported encoding
curl_setopt($ch, CURLOPT_ENCODING , 'gzip');

PHP documentation: curl_setopt中了解更多信息。
感谢评论者帮助改进这个答案。

tcomlyy6

tcomlyy62#

多功能GUNZIP功能:

function gunzip($zipped) {
      $offset = 0;
      if (substr($zipped,0,2) == "\x1f\x8b")
         $offset = 2;
      if (substr($zipped,$offset,1) == "\x08")  {
         # file_put_contents("tmp.gz", substr($zipped, $offset - 2));
         return gzinflate(substr($zipped, $offset + 8));
      }
      return "Unknown Format";
   }

函数与CURL集成示例:

$headers_enabled = 1;
      curl_setopt($c, CURLOPT_HEADER,  $headers_enabled)
      $ret = curl_exec($c);

      if ($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 header found\n");
            return gunzip($data);
         }
      }

      return $ret;

相关问题