2010-03-07 6 views
7

Meine CSS-Datei ist eigentlich eine PHP-Datei, die mit Inhaltstyp text/css serviert wird, so dass ich PHP-Variablen in dieser Datei verwenden kann. style.php sieht wie folgt aus:Cache-Header für dynamische CSS (generiert über PHP)

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

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

Es funktioniert wie erwartet, aber ich bin ein bisschen besorgt, wenn der Browser die dynamisch erstellte CSS-Datei zwischenspeichert.

Beim Betrachten der Anfragen in Firebug scheint mir, dass der Browser style.php jedes Mal neu geladen wird, wenn ich die Seite neu lade.

Ich habe bereits versucht, diesen Cache-Header hinzuzufügen:

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

Aber kein Glück. Die Datei wird immer noch geladen, wenn die Seite geladen wird. Was sind die entsprechenden Header, um den Browser zu zwingen, die Datei für einen bestimmten Zeitraum zwischenzuspeichern?

Antwort

2

Wenn Sie eine Datei sollen von Browsern zwischengespeichert werden, können Sie den Cache-Control-Header an den öffentlichen setzen sollen

header('Cache-control: public'); 

Must-revalidate bedeutet, dass der Browser zu sehen, prüft, ob die Datei aktualisiert wurde , die Ihr PHP-Skript aufruft.

+5

Nach dem HTTP/1.1-Spezifikation, das ist nicht das, was muss validierenden bedeuten soll - es sollte nur in treten, nachdem der zwischengespeicherten Inhalt abgestanden worden ist (wie vom Verfällt Header oder ein Max-Age-Wert innerhalb von Cache-Control), aber einige Browser scheinen die Spezifikation zu ignorieren und die Anfrage dennoch zu senden. 'öffentlich' ist jedoch nicht wirklich anwendbar, es sei denn, die Verbindung ist authentifiziert. Ich würde 'Cache-Control: max-age = 86400' verwenden, um die Zeit im Expires-Header zu verstärken. –

+0

@Brock Batsell: Danke für den Kommentar! Das hat es geklärt und es funktioniert jetzt mit max-age = XXXX – Max

+0

Wenn der Dateiinhalt geändert wird, wird die angeforderte Datei nicht aktualisiert. Das OP fordert an, dass die Datei nicht zwischengespeichert werden soll, wenn der Inhalt geändert wird. Wenn sich der Dateiinhalt nicht geändert hat, sollte er zwischengespeichert werden. Der von Ihnen bereitgestellte Code aktiviert die Funktion "Caching". Es löst das Problem des OP nicht. –

1

Dieser Code löst Ihr Problem.

Es prüft die Variable "letzte Änderung" und weist der Datei ein eTag zu. Wenn der eTag geändert wird (oder die Datei geändert wird), wird die Datei angezeigt. Andernfalls gibt es einen HTTP-Fehler 304, der besagt, dass die Seite nicht geändert wurde.

Das eTag ist genau das, wonach Sie suchen.

Code:

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