2009-07-21 30 views
7

Tengo algunos tutoriales sobre cómo gzip un archivo css en el que se crea un archivo php público para incluir archivos css con compresión. El problema es que no puedo copiar mis archivos CSS. Estoy usando firebug como referencia y en realidad he intentado usar el mismo código para comprimir algunos javascript y lo almacena bien.Almacenamiento en caché gss css

Aquí está el código:

 
if(extension_loaded('zlib')){ 
ob_start('ob_gzhandler'); 
} 
$offset = 60 * 60 * 24 * 31; 
header('Content-type: text/css'); 
header ('Cache-Control: max-age=' . $offset . ', must-revalidate'); 
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
ob_start("compress"); 
function compress($buffer) { 
    // Remove Comments, White Space, End ;'s 
    $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer); 
    $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer); 
    $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer); 
    $buffer = str_replace(';}', '}', $buffer); 
    $buffer = str_replace(' {', '{', $buffer); 
    return $buffer; 
    } 

    include('global.css'); 

    if(extension_loaded('zlib')){ 
    ob_end_flush(); 
} 

entonces yo soy simplemente hacer referencia a mi archivo php como un documento CSS en otras páginas. Como puede ver, he intentado agregar la edad máxima a la mezcla, que tampoco ha tenido éxito.

Aquí están las cabeceras de respuesta

 
Date  
Tue, 21 Jul 2009 19:59:19 GMT 

Server 
Apache/1.3.41 (Darwin) PHP/4.4.9 

X-Powered-By  
PHP/4.4.9 

Cache-Control 
max-age=2592000, must-revalidate 

Expires 
Thu, 20 Aug 2009 19:59:19 GMT 

Content-Encoding  
gzip 

Vary  
Accept-Encoding 

Keep-Alive 
timeout=15, max=93 

Connection 
Keep-Alive 

Transfer-Encoding 
chunked 

Content-Type  
text/css 

¿Hay algo que me falta, o una mejor manera de ir haciendo esto?

Gracias,

EDIT:

Un script que detecta si el archivo se ha cambiado & el envío de un 304 si no tiene, en combinación con las cabeceras adecuadas ha resuelto este problema.

Arthur

Respuesta

7

Trate de añadir esto al conjunto de cabeceras: -

$offset = 60 * 60 * 24; 
header('Content-type: text/css'); 
header('Cache-Control: max-age=' . $offset); 
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT'); 

El problema era la instrucción must-revalidate en la cabecera de control de caché. Esto provocaría que el cliente vuelva a solicitar el CSS cada vez que sea necesario y su código no se encargará del encabezado If-Modified-Since y del envío de un código de estado de respuesta 304 Unmodified.

El enfoque anterior reduce el período de caché a 1 día y elimina la necesidad de revalidar las instrucciones. También agrega el encabezado Last-Modified (una memoria caché puede elegir no almacenar en caché un elemento cuando falta un encabezado Last-Modified o ETag).

Para mejorar esto, puede encontrar la última hora de modificación real del archivo css que está comprimiendo y enviarlo como el encabezado Last-Modified. Podría incluir en su código una comparación de las solicitudes del encabezado If-Modified-Since con el valor de los archivos css de la última vez que se modificó. Si los encuentra iguales, envíe este conjunto de encabezados pero también envíe un estado 304 No modificado y no envíe el cuerpo en absoluto. (En realidad, no soy una persona de PHP, así que le dejaré eso a los expertos en PHP para que coloquen otra respuesta).

Realice una evaluación realista de cuánto tiempo le gustaría que un caché del cliente guarde el css antes de que deba hacer otro intento para recuperarlo y establecer el valor de la máxima edad en consecuencia.

+0

Hola Anthony, He intentado agregar Last-Modified como sugirió con la combinación de una fecha de modificación posterior y anterior sin suerte. También he enviado encabezados con un ETag & If modificado desde entonces, y todavía no está en caché ... Gracias por su respuesta, tendré todo esto en cuenta para futuras referencias y depuración. – askon

+0

@askon: Esos no fueron los factores críticos, el problema clave es la inclusión de la directiva must-revalidate en el encabezado Cache-Control. Usar eso significa que el CSS siempre será recuperado. ¿También está utilizando la actualización de página (F5) en su prueba? Eso no probará nada, los recursos como css se vuelven a recopilar en un contexto de actualización y sin un mecanismo 304 integrado en el código que resultará en una recuperación completa del recurso. – AnthonyWJones

+0

Lo siento, debería haber sido un poco más específico. Me hicieron quitar la línea debe revalidar, aquí está mi respuesta cabecera: http://freetexthost.com/zqbddbchvz Lo que no entiendo es que puedo trato de la misma escritura exacta, excepto en un text/javascript documento y muestra un 200 y lo almacena en caché. – askon

-1

Si lee Python/Django, se puede leer el código de django compressor. Pone múltiples archivos CSS en uno. La parte de CSS parece que inicia CSSTidy para limpiar el CSS.

+0

2014-12-03: Hola, @downvoter, gracias por visitarnos y darnos tu opinión sobre una respuesta de 5 años y medio. – hughdbrown

Cuestiones relacionadas