2010-03-07 10 views
7

Mi archivo CSS es en realidad un archivo PHP que se sirve con el tipo de contenido text/css para que pueda usar variables PHP en ese archivo. style.php se parece a esto:encabezados de caché para css dinámico (generado a través de PHP)

<?php 
header('Content-Type: text/css'); 
$bgColor = '#000'; 
?> 

body { background:<?php print $bgColor; ?>; } 

Funciona como se esperaba, pero estoy un poco preocupado si el navegador almacena en caché el archivo CSS creado de forma dinámica.

Cuando miro las solicitudes en firebug, me parece que el navegador está cargando style.php de nuevo cada vez que recargo la página.

ya he intentado añadir estas cabeceras de caché:

header('Cache-control: must-revalidate'); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT'); 

Pero no hubo suerte. El archivo aún se carga cada vez que se carga la página. ¿Cuáles son los encabezados apropiados para obligar al navegador a almacenar en caché el archivo durante un cierto período de tiempo?

Respuesta

2

Si desea un archivo que se almacena en caché por los navegadores, se debe establecer la cabecera Cache-control para el público:

header('Cache-control: public'); 

deber-revalidate significa que el navegador va a comprobar para ver si el archivo se ha actualizado , que invocará su script PHP.

+5

De acuerdo con la especificación HTTP/1.1, eso no es lo que se debe a validar se supone que significa - que sólo se supone que entran en juego después de que el contenido almacenado en caché se ha vuelto rancio (como se indica por el Expira encabezado, o un valor máximo de edad dentro de Cache-Control), pero algunos navegadores parecen ignorar la especificación y enviar la solicitud de todos modos. 'público' no es realmente aplicable, a menos que la conexión esté autenticada. Yo usaría 'Cache-Control: max-age = 86400' para reforzar el tiempo en el encabezado Expires. –

+0

@Brock Batsell: gracias por el comentario! Eso lo aclaró y funciona ahora con max-age = XXXX – Max

+0

Si se cambia el contenido del archivo, el archivo solicitado no se actualizará. El OP solicita que el archivo no se almacene en caché si se cambia el contenido. Si el contenido del archivo no ha cambiado, debe almacenarse en caché. El código que proporcionó activa la función de "almacenamiento en caché". No resuelve el problema del OP. –

1

Este código resuelve su problema.

Comprueba la variable "última modificación" y asigna una eTag para el archivo. Si se modifica eTag (o se modifica el archivo), se muestra el archivo. De lo contrario, hay un error HTTP 304 que indica que la página no se modificó.

El eTag es en realidad lo que estás buscando.

Código:

<?php 
// Custom variables 
$variables = array('#CCC','#800'); // from db 

// CSS Content 
header('Content-type: text/css'); 

// Last Modified 
$lastModified = filemtime(__FILE__); 

// Get a unique hash of this file (etag) 
$etagFile = md5_file(__FILE__); 

// Get the HTTP_IF_MODIFIED_SINCE header if set 
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); 

// Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash) 
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); 

// Set last-modified header 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT"); 

// Set etag-header 
header("Etag: $etagFile"); 

// Make sure caching is turned on 
header('Cache-Control: public'); 

// Check if page has changed. If not, send 304 and exit 
if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){ 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
?> 
body {background: <?php echo $variables[0]; ?>;} 
Cuestiones relacionadas