Sonntag, 17. Januar 2010

Komprimierung von statischen Dateien mit PHP

In dem heutige Artikel schreibe ich über die Möglichkeit, die Komprimierung von statischen Dateien durch PHP zu realisieren. Ob diese Lösung sinnvoll ist, muss jeder selbst entscheiden.

Fangen wir zu erst mit der technischen Umsetzung an. Wenn wir PHP-Anweisungen in CSS-, Javascript- oder HTML-Dateien ausführen wollen, können wir dies sehr einfach über .htaccess-Anweisungen tun:

AddHandler application/x-httpd-php .css
AddHandler application/x-httpd-php .js
AddHandler application/x-httpd-php .htm .html
php_flag zlib.output_compression on
php_value zlib.output_compression_level 9
auto_prepend_file = "pre.php"
short_open_tag = 0

Die AddHandler-Anweisungen bewirken, dass alle Dateien mit der Endung .css, .js, .htm oder .html durch den PHP-Interpreter gejagt werden. Mit der vierten Zeile schalten wir die Komprimierung für die Ausgabe ein und mit der fünften Zeile wird die Ausgabe maximal komprimiert. In der sechsten Zeile wird die Ausgabe durch die pre.php gejagt. Diese Angabe nutzen wir, um den richtigen Header zu setzen. Die siebte Zeile verhindert, dass z.B. XML-Angaben (<?xml) fälschlicherweise als PHP-Angabe interpretiert werden.

Die Datei pre.php könnte wie folgt aussehen:

<php
$path = pathinfo($_SERVER['SCRIPT_NAME']);

if ($path['extension'] == 'css') {
header('Content-type: text/css');
}

if ($path['extension'] == 'js') {
header('Content-type: application/x-javascript');
}

if ($path['extension'] == 'htm' || $path['extension'] == 'html') {
header('Content-type: text/html');
}
?>


Mit diesen wenigen Handgriffen werden nun alle CSS-, Javascript- oder HTML-Dateien komprimiert ausgegeben. Eine ideale Lösung, wenn der Hoster die Anweisungen mod_gzip_on oder mod_deflate in der .htaccess nicht erlaubt.

Ich möchte zum Schluss noch einige Hinweise geben:
  • Komprimierung macht wenig Sinn, wenn die Dateien klein sind. Man sollte daher z.B. mehrere CSS-Dateien (oder Javascript) zu einer Datei verschmelzen.
  • Man sollte das Ergebnis immer sinnvoll cachen, um den Server nicht mit überflüssiger Komprimierung zu belasten.
  • Der IE6 kann komprimierte Dateien nicht im Cache halten.
  • Man kann dynamisches CSS (z.B. Hintergrundbild nach Uhrzeit oder Herkunft setzen) sehr leicht mit PHP realisieren. Das führt allerdings bei stark frequentierten Sites zu hoher Systemlast, weil diese Ergebnisse nicht gecacht werden sollten.
  • Man sollte die Komprimierung aus Sicherheitsgründen auf bestimmte Verzeichnisse (z.B. /css/ oder /js/) beschränken.