web-dev-qa-db-ja.com

PHPでcURLを介して取得したgzip圧縮されたWebページをデコードします

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

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

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

....しかし、男、より良い方法があるはずです。

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

50
Ian

Curlを使用して:

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

gzdecodeのPHPページ のコメントにいくつかの解決策が提案されています。

2
Oddthinking

汎用性のある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; 
2
Maryam Jeddian