web-dev-qa-db-fra.com

Décoder la page Web compressée gzip récupérée via cURL dans PHP

Je récupère une page Web gzippée via curl, mais lorsque je génère le contenu récupéré dans le navigateur, j'obtiens simplement les données brutes gzippées. Comment décoder les données en PHP?

Une méthode que j'ai trouvée était d'écrire le contenu dans un fichier tmp puis ...

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

.... mais mec, il doit y avoir une meilleure façon.

Edit: Ce n'est pas un fichier, mais une page html compressée renvoyée par un serveur web.

50
Ian

J'utilise curl et:

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

Plusieurs solutions sont proposées dans les commentaires sur le page PHP pour gzdecode .

2
Oddthinking

Fonction GUNZIP polyvalente:

 fonction gunzip ($ zippé) {
 $ offset = 0; 
 if (substr ($ zippé, 0,2) == "\ x1f\x8b") 
 $ offset = 2; 
 if (substr ($ zippé, $ offset, 1) == "\ x08") {
 # file_put_contents ("tmp.gz", substr ($ zippé. , $ offset - 2)); 
 renvoie gzinflate (substr ($ zippé, $ offset + 8)); 
} 
 renvoie "Format inconnu"; 
 } 

Exemple d'intégration de fonction avec CURL:

 $ headers_enabled = 1; 
 curl_setopt ($ c, CURLOPT_HEADER, $ headers_enabled) 
 $ ret = curl_exec ($ c); 
 
 si ($ headers_enabled) {
 # file_put_contents ("preungzip.html", $ ret); 
 
 $ sections = explosode ("\ 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\n"); 
 return gunzip ($ 
} 
} 
 
 return $ ret; 
2
Maryam Jeddian