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.
J'utilise curl et:
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
Plusieurs solutions sont proposées dans les commentaires sur le page PHP pour gzdecode .
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;