Question

Je récupère une page Web compressée via curl, mais lorsque je transmets le contenu récupéré au navigateur, je ne récupère que les données brutes compressées. Comment décoder les données en PHP?

Une méthode que j'ai trouvée consistait à écrire le contenu dans un fichier tmp, puis ...

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

.... mais l'homme, il doit y avoir une meilleure façon.

Éditer: Ce n'est pas un fichier, mais une page html gzippée renvoyée par un serveur Web.

Était-ce utile?

La solution

J'utilise curl et:

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

Autres conseils

Plusieurs solutions sont proposées dans les commentaires de la page PHP pour gzdecode .

Fonction GUNZIP polyvalente:

   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";
   }  

Exemple d'intégration d'une fonction avec 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top