Decodifique la página web comprimida recuperada a través de cURL en PHP
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.
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