Frage

Ich bin Abrufen einer gzip-Webseite über curl, aber wenn ich Ausgabe der abgerufenen Inhalte an den Browser bekomme ich nur die rohen gzipped Daten. Wie kann ich die Daten in PHP dekodieren?

Eine Methode, ich fand, war, den Inhalt einer tmp-Datei zu schreiben und dann ...

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

.... aber der Mensch, es muss ein besserer Weg sein.

Edit:. Dies ist keine Datei, sondern eine gzip-HTML-Seite von einem Webserver zurückgegeben

War es hilfreich?

Lösung

Ich verwende Curl und:

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

Andere Tipps

Es gibt mehrere Lösungsvorschläge in den Kommentaren auf der PHP-Seite für gzdecode .

Versatile Gunzip Funktion:

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

Beispiel der Funktion mit CURL Integration:

      $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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top