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

Ian*_*Ian 51 php encoding gzip decoding

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

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

$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);
Run Code Online (Sandbox Code Playgroud)

....但是男人,必须有一个更好的方式.

编辑:这不是文件,而是由Web服务器返回的gzip压缩页面.

jon*_*asl 124

我用curl和:

curl_setopt($ch,CURLOPT_ENCODING , "gzip");
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此选项在请求*上设置`Accept-Encoding:gzip`标头,并且*如果它被压缩(可能不是),则解压缩响应,因此确实只需要做. (15认同)
  • 将它设置为''gzip'将*总是*发送`Accept-Encoding:gzip`,即使你的PHP版本不支持解码gzip(那么你将得到压缩数据).如果将其设置为'''`(空字符串),curl将自动声明并解码它支持的所有编码. (6认同)

Mar*_*ian 5

多功能 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 = 爆炸("\x0d\x0a\x0d\x0a", $ret, 2);
         while (!strncmp($sections[1], 'HTTP/', 5)) {
            $sections =explode("\x0d\x0a\x0d\x0a", $sections[1], 2);
         }
         $headers = $sections[0];
         $数据=$节[1];

         if (preg_match('/^内容编码: gzip/mi', $headers)) {
            printf("找到 gzip 标头\n");
            返回gunzip($数据);
         }
      }

      返回$ret;