2010-03-07 10 views
7

Il mio file CSS è acutally un file PHP che viene servito con il tipo di contenuto text/css in modo che io possa utilizzare le variabili PHP in quel file. style.php assomiglia a questo:intestazioni cache per css dinamico (generato tramite PHP)

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

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

Esso funziona come previsto, ma io sono un po 'preoccupato se il browser memorizza nella cache il file css creato in modo dinamico.

Osservando le richieste in firebug, mi sembra che il browser stia caricando di nuovo style.php ogni volta che ricarico la pagina.

ho già provato ad aggiungere queste intestazioni di cache:

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

ma senza fortuna. Il file è ancora caricato ogni volta che viene caricata la pagina. Quali sono le intestazioni appropriate per forzare il browser a mettere in cache il file per un certo periodo di tempo?

risposta

2

Se si desidera un file da memorizzare nella cache dai browser, è necessario impostare l'intestazione Cache-Control per pubblico:

header('Cache-control: public'); 

must-revalidate significa che il browser verifica se il file è stato aggiornato , che invocherà il tuo script PHP.

+5

Secondo l'/ 1.1 spec HTTP, non è quello che deve-validate dovrebbe significare - si suppone solo a calciare in dopo che il contenuto memorizzato nella cache è diventato stantio (come indicato dal Scade intestazione, o un valore max-age all'interno di Cache-Control), ma alcuni browser sembrano ignorare le specifiche e inviare comunque la richiesta. "pubblico" non è realmente applicabile, tuttavia, a meno che la connessione non sia autenticata. Vorrei usare "Cache-Control: max-age = 86400" per rinforzare il tempo nell'intestazione Expires. –

+0

@Brock Batsell: grazie per il commento! Questo lo ha chiarito e ora funziona con max-age = XXXX – Max

+0

Se il contenuto del file viene modificato, il file richiesto non verrà aggiornato. L'OP richiede che il file non venga memorizzato nella cache se il contenuto viene modificato. Se il contenuto del file non è cambiato, dovrebbe essere memorizzato nella cache. Il codice fornito attiva la funzione "memorizzazione nella cache". Non risolve il problema dell'OP. –

1

Questo codice risolve il problema.

Controlla la variabile "ultima modifica" e assegna un eTag per il file. Se l'eTag viene modificato (o il file viene modificato), viene visualizzato il file. Altrimenti, c'è un errore HTTP 304 che indica che la pagina non è stata modificata.

L'eTag è in realtà quello che stai cercando.

Codice:

<?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]; ?>;}