Pregunta

Estoy recuperando una página web comprimida mediante curl, pero cuando envío el contenido recuperado al navegador, solo obtengo los datos comprimidos sin procesar. ¿Cómo puedo decodificar los datos en PHP?

Un método que encontré fue escribir el contenido en un archivo tmp y luego ...

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

.... pero hombre, tiene que haber una mejor manera.

Editar: este no es un archivo, sino una página HTML comprimida devuelta por un servidor web.

¿Fue útil?

Solución

Uso curl y:

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

Otros consejos

Hay varias soluciones propuestas en los comentarios en la página PHP para gzdecode .

Función versátil 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";
   }  

Ejemplo de integración de función con 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top