En este momento estoy tratando de servir a los archivos CSS y JS de un servidor que no me deja activo el mod_gzip
o mod_deflate
. Así que escribí un pequeño script PHP para comprimir con GZIP y devolverlo al usuario.Cómo determinar la longitud del contenido de un archivo descomprimido?
Código Ejemplo:
$filename = "style.css";
if (!file_exists($filename) || !($info = stat($filename))) {
header("HTTP/1.1 404 Not Found");
die();
}
header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("Etag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Cache-Control: Expires ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/html");
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
estoy teniendo dos problemas en este momento. El primero es que tengo problemas para determinar el tamaño resultante del archivo comprimido para informar al navegador de la longitud del contenido. Normalmente, me gustaría incluir esta línea:
header("Content-Length: ".$info["size"]);
Pero, si lo hago, el navegador se cuelga al tratar de esperar para más datos. ¿Hay alguna manera de calcular el tamaño total? O debería ignorar esta directiva de encabezado.
La otra cuestión es, cada vez que veo este archivo PHP en Firefox, se trata de tener me descarga el resultado. En Chrome, simplemente lo muestra como era de esperar. ¿Alguna sugerencia?
Editar: Gracias a SoapBox, que sustituyó a la final del código con esto:
header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);
Esto funciona muy bien para la longitud de contenido! Pero sigo pidiendo a Firefox que descargue el archivo en lugar de mostrarlo. :(
Editar Una vez más: Aquí está el código modificado de fin de código, cortesía de Cletus
// Start buffered output
ob_start();
// Check for gzip capability
if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip") !== false) {
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
} else
echo file_get_contents($filename);
// Write the content length
header('Content-Length: '.ob_get_length());
ob_end_flush();
Voy a comenzar una nueva pregunta para averiguar por qué Firefox sigue intentando. descargue el archivo
Algunos de los encabezados mencionados en las respuestas tienen algunos errores; El doble Cache-Control, la línea con Cache-Control: expira .... debe ser Expira: ... Y Etag debe ser ETag. –