2009-07-21 3 views
7

Ich habe über einige Tutorials wie Gzip eine CSS-Datei, in der Sie eine öffentliche PHP-Datei, um CSS-Dateien mit Komprimierung zu erstellen. Das Problem ist, ich kann es nicht bekommen, um meine CSS-Dateien zwischenzuspeichern. Ich benutze Firebug als Referenz und ich habe tatsächlich versucht, den gleichen Code zu verwenden, um etwas Javascript zu komprimieren, und es speichert es gut. HierCaching gzipped css

ist der Code:

 
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(); 
} 

Dann bin ich einfach meine PHP-Datei als CSS-Dokument auf anderen Seiten verweisen. Wie Sie sehen können, habe ich versucht, das Alter zu addieren, was sich ebenfalls als nicht erfolgreich erweist.

Hier ist der Response-Header

 
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 

Gibt es etwas, ich bin fehle, oder ein besserer Weg, um dies zu tun gehen?

Danke,

EDIT:

Ein Skript, das, ob die Datei eine 304 & erkennt das Senden geändert wurde, wenn es in Kombination mit der richtigen Header dieses Problem gelöst hat nicht hat.

Arthur

Antwort

7

versuchen, dies zu dem Satz von Header hinzugefügt: -

$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'); 

Das Problem war die must-revalidate Anweisung im Cache-Steuer-Header. Dies würde dazu führen, dass der Client die CSS jedes Mal erneut anfordert, wenn sie benötigt wird, und Ihr Code hat keine Behandlung für den If-Modified-Since-Header und das Senden eines 304 Unmodified-Antwortstatuscodes.

Der obige Ansatz reduziert die Cache-Periode auf 1 Tag und beseitigt die MUST-Revalidate-Anweisung. Außerdem wird der Last-Modified-Header hinzugefügt (ein Cache kann festlegen, dass ein Element nicht zwischengespeichert wird, wenn ein Last-Modified- oder ETag-Header fehlt).

Um dies zu verbessern, können Sie die letzte Änderungszeit der zu komprimierenden css-Datei finden und diese als Last-Modified-Header senden. Sie könnten in Ihrem Code einen Vergleich der Anfragen If-Modified-Since-Header mit dem Wert der CSS-Dateien zuletzt geändert Zeit enthalten. Wenn Sie dieselben finden, senden Sie diese Header, senden Sie aber auch einen 304 Unmodfied-Status und senden Sie den Body überhaupt nicht. (Ich bin nicht wirklich eine PHP-Person, also überlasse ich das den PHP-Experten, um sie in eine andere Antwort zu setzen).

Machen Sie eine realistische Einschätzung, wie lange Sie möchten, dass ein Client die CSS zwischenspeichert, bevor er erneut versuchen muss, sie abzurufen und den Maximalwert entsprechend einzustellen.

+0

Hey Anthony, Ich habe versucht, Last-Modified wie Sie vorgeschlagen mit der Kombination aus einem späteren und früheren Modifikationsdatum ohne Glück. Ich habe auch Header mit einem ETag & Wenn geändert seit, und es ist immer noch nicht im Cache ... Vielen Dank für Ihre Antwort, ich werde all dies für zukünftige Referenzen und Debugging berücksichtigen. – askon

+0

@askon: Das waren nicht die kritischen Faktoren, das Hauptproblem ist die Einbeziehung der must-revalidate-Direktive in den Cache-Control-Header. Damit wird die CSS immer wieder abgerufen. Verwenden Sie in Ihrem Test auch Seitenaktualisierung (F5)? Das wird nichts beweisen, Ressourcen wie css werden unter einem Aktualisierungskontext referenziert und ohne einen 304-Mechanismus in Ihren Code eingebaut, der zu einem vollständigen Abruf der Ressource führen wird. – AnthonyWJones

+0

Entschuldigung, ich hätte etwas genauer sein sollen. Ich habe die Linie wieder Validate entfernen müssen, hier ist meine Kopf Antwort: http://freetexthost.com/zqbddbchvz Was ich nicht verstehe ist, kann ich genau das gleiche Skript versuchen, außer auf einem text/javascript Dokument und es zeigt eine 200 & Caches es. – askon

-1

Wenn Sie Python/Django lesen Sie den Code für django compressor lesen kann. Es fügt mehrere CSS-Dateien in einen zusammen. Der CSS-Teil sieht so aus, als würde er CSSTidy starten, um das CSS zu bereinigen.

+0

2014-12-03: Hey, @ downvoter, danke, dass du vorbeigekommen bist und deine Gedanken zu einer fünfeinhalb Jahre alten Antwort gegeben hast. – hughdbrown