Joomlas Caching-System funktioniert nicht richtig

Der Mülleimer wird nicht leerer … und mit der Veröffentlichung von Joomla 1.5.9 hat das Entwicklerteam den endgültigen Beweis dafür geliefert.

Sicherheitsupdate 1.5.9

Aber der Reihe nach: Am 10.01.2009 wurde Joomla 1.5.9 als Sicherheitsrelease veröffentlicht. Es behebt unter anderem eine kritische Sicherheitslücke. Wer noch 1.5.8 oder ältere Versionen der 1.5.x-Reihe im Einsatz hat, sollte also unbedingt updaten.

Nach einem kurzen lokalen Test habe ich meine unter 1.5 laufenden Sites am Samstag auf die neue Version upgedatet. Wie immer nach größeren Änderungen oder einem Update habe ich dann über das Administrator-Backend den Cache gelöscht – und dabei fiel mir ein neuer Eintrag im "System"-Menü auf: "Purge Expired Cache", zu deutsch "Abgelaufene Cache-Elemente löschen".

Die Existenz dieses Menüeintrags, und dann noch gestern der Beitrag 1.5.9 Bugfixes or Features 2 – Purge Expired Cache,
zeigt deutlich auf, was vor allem Administratoren größerer Sites schon lange wussten oder vermuteten: Joomlas Caching-System kümmert sich nicht korrekt um die Verwaltung der im Verzeichnis /cache abgelegten Dateien. Im Laufe der Zeit nimmt ihre Zahl bei weitem mehr überhand, als sie es sollte.

To cache or not to cache?

Fast immer macht es Sinn, über die globale Konfiguration den Cache einzuschalten, denn diese Funktion beschleunigt die Anzeige der Seiten erheblich. Joomla muss dann nicht ständig mittels immer neuer Datenbankabfragen die Seiten vollständig neu generieren, sondern greift auf die im Dateisystem abgelegte, zwischengespeicherte Seite zu – der Geschwindigkeitszuwachs ist beträchtlich. Dies gilt umso mehr bei Hostern, die eine langsame Datenbankanbindung aufweisen.

Wenn die Inhalte auf der Seite eher dynamisch sind – z.B. Module, die bei jedem Aufruf potentiell veränderte Inhalte liefern können -, kann es allerdings klüger sein, den Cache nicht zu verwenden. In diesem Fall nimmt man dann eben die Performance-Einbuße in Kauf.

Oder man schließt einen Kompromiss: Den Cache zwar verwenden, aber eine relativ kurze Zeit für das Caching einstellen.

Cache-Einstellungen in Joomla

Über die globale Konfiguration und den Tab "System" gelangt man in die Cache-Einstellungen. Hier wird der Cache grundsätzlich an- oder abgeschaltet und die Zeit für das Cachen festgelegt. Die Auswahl "Cache Handler" ist auf "File" festgelegt – andere Caching-Möglichkeiten bietet Joomla derzeit nicht.

Wenn man sich die Einstellung "Cache Time" etwas genauer ansieht und auch den Hilfetext dazu liest ("The maximum length of time in minutes for a cache file to be stored before it is refreshed"), so hört sich das zunächst vollkommen logisch an: Hier gibt man eine Anzahl an Minuten ein, für die eine Cache-Datei gespeichert werden soll, bevor sie durch das System erneuert wird. 

Klare Sache, ich definiere hier also z.B. eine Zeit von 5 Minuten. Dann geschieht folgendes, wenn man etwa die Startseite eines Webauftritts betrachtet:

Beim nächsten Aufruf der Startseite wird für diese Seite eine Cache-Datei mit der Endung .php erzeugt und im Dateisystem des Servers abgelegt. In den nächsten fünf Minuten liefert Joomla dann beim Aufruf der Startseite immer den Inhalt dieser Datei aus. Das geht erheblich schneller, als die zur Erzeugung der Startseiten-Inhalte nötigen Datenbankabfragen wieder und wieder auszuführen. Feine Sache!

Was geschieht nach Ablauf der Cache-Zeit?

Die meisten zeitbasierten Caching-Systeme arbeiten so, dass nach Ablauf der festgelegten Zeit die alten Inhalte verworfen werden und das Zwischenspeichern neu erfolgt. Ob Festplatten-Cache oder Web-Proxy, die Funktionsweise ist grundsätzlich dieselbe.

Auch Joomla arbeitet ähnlich – mit einem kleinen Unterschied allerdings, der sich mir nicht erschließen will, und der dem oben zitierten Hilfetext widerspricht: Abgelaufene Cache-Dateien werden durch Joomla ergänzt durch eine gleichnamige Datei mit der Endung .php_expire, deren Inhalt aus einem Zeitstempel besteht – und bleiben im Dateisystem liegen. So sammeln sich im Lauf der Zeit hunderte und tausende dieser abgelaufenen Cache-Datei-Leichen an.

Wozu das gut sein soll, außer die Platte in erheblichem Umfang vollzumüllen, habe ich noch nie verstanden. Ich habe mir deswegen angewöhnt, in regelmäßigen Abständen den Cache zu löschen. Das kann man manuell über die Joomla-Administration tun, oder automatisch über einen Cronjob.

Statt den Fehler endlich einmal zu korrigieren (und in meinen Augen ist dieses Verhalten ein Fehler), hat man nun – mit etwas eigentümlicher Logik – das Löschen abgelaufener Cache-Dateien dem Administrator überlassen und empfiehlt, den neuen Befehl von Zeit zu Zeit manuell auszuführen.

Wo ist nun der Unterschied zum bisherigen Löschbefehl für den Cache? Mit dem neuen Menüeintrag werden nur die als "abgelaufen" gekennzeichneten Cache-Dateien gelöscht. Die noch gültigen (also in unserem Beispiel die weniger als fünf Minuten alten) Cache-Dateien bleiben erhalten.

Ob es diese Unterscheidung nun noch gebraucht hätte, wage ich stark zu bezweifeln. Sinnvoller wäre es gewesen, dem Core endlich beizubringen, dass abgelaufene Cache-Dateien bitte grundsätzlich aufzuräumen sind, und die Nutzer nicht mit einer weiteren, relativ überflüssigen Option zu behelligen. Dass man das wiederkehrende manuelle Benutzen dieses Befehls auch noch ausdrücklich empfiehlt, hat einen sehr merkwürdigen Charme.

Zählt doch einmal spaßeshalber, wieviele Dateien mit der Endung .php_expire bei Euch im Verzeichnis /cache/com_content liegen. Die gleiche Zahl Cache-Dateien mit der Endung .php muss man dann noch dazurechnen, um auf die Gesamtzahl überflüssiger Dateien zu kommen. Bei mir geht das auf ein, zwei kleineren Sites jeweils schon in Richtung 1.000 Dateien.

Fazit: Bei Joomla streikt die Müllabfuhr.

Und das schon ziemlich lange. Ein Ende scheint nicht in Sicht, wir Administratoren müssen den Krempel weiterhin selbst entsorgen.

Kommentieren