58

curl を使用して gzip 圧縮された Web ページを取得していますが、取得したコンテンツをブラウザーに出力すると、生の gzip 圧縮データが取得されます。PHPでデータをデコードするにはどうすればよいですか?

私が見つけた1つの方法は、コンテンツをtmpファイルに書き込んでから...

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

....しかし、もっと良い方法があるはずです。

編集: これはファイルではなく、Web サーバーから返された gzip された html ページです。

4

2 に答える 2

141

私はcurlを使用しています:

curl_setopt($ch, CURLOPT_ENCODING , "gzip");
于 2010-05-17T13:21:55.533 に答える
3

用途の広いGUNZIP機能:

   関数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));
         gzinflate(substr($ zipped、$ offset + 8));を返します。
      }
      「不明な形式」を返します。
   }  

関数を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ヘッダーが見つかりました\n");
            gunzip($ data);を返します。
         }
      }

      $retを返します。
于 2011-01-30T07:27:44.583 に答える