2008-11-22 11 views
46

Estoy recuperando una página web con gzip mediante curl, pero cuando obtengo el contenido recuperado en el navegador obtengo los datos brredeados sin formato. ¿Cómo puedo decodificar los datos en PHP?Decodificar página web comprimida recuperada mediante cURL en PHP

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

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

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

Editar: Esto no es un archivo, sino una página html con gzip devuelta por un servidor web.

+0

Es el propio archivo comprimido con gzip, o es el servidor gzip para la transferencia? – Artelius

+2

En lugar de decodificar los datos gzip, ¿podría enviar los encabezados correctos para que el navegador lo reconozca correctamente? O, si no lo quiere en primer lugar, dígale a cURL que no pida datos comprimidos configurando CURLOPT_ENCODING en "identidad". –

Respuesta

101

utilizo rizo y:

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

Solo para tener en cuenta que esta opción establece el encabezado 'Accept-Encoding: gzip' en la solicitud * y * descomprime la respuesta si está comprimida (puede que no sea así), por lo que es todo lo que necesita hacer. – Synchro

+0

Solución perfecta para CURL. –

+4

Configurarlo en ''gzip'' * siempre * enviará 'Aceptar-Codificación: gzip', incluso cuando su versión de PHP no admita la decodificación gzip (entonces obtendrá los datos comprimidos). Si lo configura en '''' (cadena vacía), Curl anunciará y decodificará automáticamente todas las codificaciones que admita. – AndreKR

2

Versátil GUNZIP función:

 
    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 función integradora 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;