Für Administratoren
Als Administrator bietet Joomla die Möglichkeit, Teile der Website zwischenzuspeichern (zu cachen). Es kann gewählt werden, ob ganze Webseiten oder nur Teile dieser Seiten zwischengespeichert werden. Diese Anleitung erklärt, wie das funktioniert.
Auf einer Joomla-Webseite können 3 Dinge zwischengespeichert werden:
- Die gesamte Seite selbst – der Page-Cache
- Die Ausgabe der Joomla-Komponente für diese Webseite – bekannt als View-Cache
- Die Ausgabe der auf dieser Seite angezeigten Module – bekannt als Modul-Cache
Es gibt mehrere Cache-Einstellungen, mit denen gesteuert werden kann, was zwischengespeichert wird:
- Das Systemplugin „System – Page Cache“
- Die Globale Konfiguration, Reiter System, Cache-Einstellungen. Hier kann die Option Systemcache auf Folgendes gesetzt werden:
- AUS – Caching deaktiviert
- AN – Konservatives Caching
- AN – Progressives Caching
- Viele Module verfügen in ihren Optionen über einen Reiter „Erweitert“, in dem das Caching auf Global verwenden oder Kein Caching gesetzt werden kann
Wie unten beschrieben, gibt es außerdem Regeln für das Caching, die im Joomla-Code implementiert sind und auf die kein Einfluss genommen werden kann.
Der Cache kann über die Menüauswahl Administrator → System → Cache leeren geleert werden. Im Allgemeinen kann man sich vorstellen, dass Joomla über 3 Cache-Ebenen verfügt, die in ihrer Intensität zunehmen:
- Konservatives Caching
- Progressives Caching
- Page-Caching
Zusätzlich können Joomla-Entwickler Caching-Funktionen nutzen, um das Ergebnis von Datenbankabfragen zu speichern, zum Beispiel um die Reaktionsfähigkeit der Website zu erhöhen, aber dies liegt außerhalb des Zuständigkeitsbereichs eines Administrators.
Page-Caching
Um dies einzuschalten, zu Administrator → Erweiterungen → Plugins gehen. Dort das Plugin „System – Page Cache“ suchen und aktivieren. Das bedeutet, dass Website-Seiten nun zwischengespeichert werden, und wann immer sie erneut angefordert werden, wird die zwischengespeicherte Seite ausgeliefert, anstatt sie von Joomla anhand der Informationen aus der Datenbank neu erzeugen zu lassen. Die zwischengespeicherte Seite wird weiterhin ausgeliefert, bis sie abläuft – wie durch den Parameter Cache-Dauer in Administrator → Globale Konfiguration → Reiter System → Cache-Einstellungen festgelegt.
Wer diese Seite als Tutorial liest und das Page-Caching testen möchte, sollte am besten die Cache-Einstellungen der Globalen Konfiguration wie folgt setzen:
- Cache-Handler – Datei
- Pfad zum Cache-Verzeichnis – leer lassen
- Cache-Dauer – 15 (Standardwert von 15 Minuten)
- Plattformspezifisches Caching – Nein
- Systemcache – AUS – Caching deaktiviert
Um zu überprüfen, ob das Page-Caching funktioniert, eine Website-Seite aufrufen, die einen Beitrag anzeigt. Nachdem diese Seite angezeigt wurde, sollte im Dateisystem ein Verzeichnis cache/page mit einer Datei darin zu finden sein, deren Dateiname etwa xxx-cache-page-yyy.php lautet, wobei xxx und yyy lange Hash-Zeichenfolgen sind. Joomla muss für unterschiedliche URLs separate Cache-Seiten speichern, daher ist die zweite Zeichenfolge aus Hex-Ziffern ein Hash der URL der Website-Seite, um den Dateinamen für diese Seite eindeutig zu machen.
Anschließend über die Administrator-Funktionalität den Text dieses Beitrags ändern und die Website-Seite erneut anzeigen. Es sollte die zwischengespeicherte Version angezeigt werden, nicht der geänderte Text.
Das Ändern eines Beitrags (oder eines anderen Joomla-Eintrags) leert nicht den Page-Cache für die Webseite(n), auf denen dieser Beitrag angezeigt wird. Um den Page-Cache zu leeren, zu Administrator → System → Cache leeren gehen. Das Kontrollkästchen neben der Cache-Gruppe namens „page“ anklicken und die Schaltfläche Löschen drücken. Beim erneuten Anzeigen der Webseite sollte nun der geänderte Text zu sehen sein.
Wenn die Website über eine Funktion wie einen Warenkorb verfügt, führt die Anwendung des Page-Cachings zu Problemen, da Seiten anzeigen müssen, was der Kunde bereits ausgewählt hat, anstatt eine zwischengespeicherte Seite anzuzeigen, die für alle gleich ist. Allerdings kann das Plugin System – Page-Cache so konfiguriert werden, dass bestimmte Menüeinträge oder bestimmte URLs und URL-Bereiche (im Tab Erweitert) vom Caching ausgeschlossen werden, sodass nur wirklich statische Seiten zwischengespeichert werden.
Konservatives Caching
Mit Konservativem Caching kann die View-Ausgabe von Komponenten sowie die Ausgabe der Module, die Caching erlauben, zwischengespeichert werden. Zu beachten ist jedoch, dass dies nur auf Seiten funktioniert, die nicht über den Page-Cache zwischengespeichert werden. Bei diesen Seiten wird die gesamte Webseite zwischengespeichert, und Konservatives Caching wird dabei gar nicht berücksichtigt.
So wird Konservatives Caching eingeschaltet:
- Zu Administrator → System → Allgemeine Einstellungen → Tab System gehen und unter Cache-Einstellungen den System-Cache auf AN – Konservatives Caching setzen
- Zu Administrator → Erweiterungen → Module gehen und die Module auswählen, die zwischengespeichert werden sollen. Falls das jeweilige Modul Caching erlaubt, sollte es im Tab Erweitert möglich sein, Caching auf Folgendes zu setzen:
- Global verwenden – dieses Modul wird zwischengespeichert (wobei die globale Option nun auf Konservatives Caching gesetzt wurde)
- Kein Caching – dieses Modul wird nicht zwischengespeichert.
(Zu beachten ist, dass die Cache-Dauer in den Allgemeinen Einstellungen in Minuten angegeben wird, die Cache-Dauer in den Moduleinstellungen jedoch in Sekunden.)
Um zu überprüfen, ob es funktioniert, zur eigenen Website gehen, sicherstellen, dass man abgemeldet ist, und zu einer Webseite navigieren, die einen Beitrag anzeigt. Das Dateisystem überprüfen – dort sollte sich ein Verzeichnis cache/com_content mit einer Cache-Datei finden lassen.
Es finden sich auch weitere Verzeichnisse wie cache/com_languages (da beim Anzeigen der Seite auch die aktuelle Sprache geladen wird, die ebenfalls zwischengespeichert wird) sowie Verzeichnisse, die den Modul-Cache betreffen, z. B. cache/com_modules. Diese entstehen durch die Verwendung von Caching, das Entwickler innerhalb der Joomla-Anwendung programmiert haben.
Wird dieser Beitrag bearbeitet und gespeichert und anschließend die Seite der Website aktualisiert, zeigt die Website diesmal den aktualisierten Text an. Das liegt daran, dass Joomla beim Speichern einer Bearbeitung den Cache für diesen Beitrag leert.
Es lässt sich jedoch zeigen, dass der Cache funktioniert, wenn die Cache-Datei im Verzeichnis cache/com_content mit einem einfachen Texteditor bearbeitet wird. Im Editor einen Buchstaben innerhalb des Beitragstextes in der Cache-Datei ändern und die Datei speichern. Wird die Webseite anschließend aktualisiert, sollte die an der Cache-Datei vorgenommene Änderung sichtbar sein.
Wie lässt sich auswählen, welche Komponenten-Views zwischengespeichert werden, und unter welchen Umständen? Leider lässt sich das nicht einstellen. Dies wird von den Entwicklern der Joomla-Kernkomponenten festgelegt und im PHP-Code der Komponente programmiert. Die Kriterien unterscheiden sich für jede Komponente. Es lässt sich jedoch leicht herausfinden, welche Kriterien verwendet werden, da sie für jede der Site-Komponenten in der jeweiligen DisplayController.php-Datei der Site codiert sind. Zum Zeitpunkt dieser Überarbeitung (Joomla Version 5) findet sich beispielsweise für die Komponente Kontakte in components/com_contact/src/Controller/DisplayController.php Folgendes:
public function display($cachable = false, $urlparams = [])
{
if ($this->app->getUserState('com_contact.contact.data') === null) {
$cachable = true;
}
Das bedeutet, dass die mit Kontakten verbundenen Views zwischenspeicherbar sind, es sei denn, es liegen Sitzungsdaten vor, die unter com_contact.contact.data gespeichert sind – dies ist der Fall, wenn in der Benutzersitzung ein Kontaktformular angezeigt wurde (z. B. auf einer Seite, auf die ein Menüeintrag vom Typ Kontakte → Einzelner Kontakt verweist).
Die entsprechende Datei für Beiträge, components/com_content/src/Controller/DisplayController.php, enthält:
public function display($cachable = false, $urlparams = false)
{
$cachable = true;
/**
* Set the default view name and format from the Request.
* Note we are using a_id to avoid collisions with the router and the return page.
* Frontend is a bit messier than the backend.
*/
$id = $this->input->getInt('a_id');
$vName = $this->input->getCmd('view', 'categories');
$this->input->set('view', $vName);
$user = $this->app->getIdentity();
if (
$user->get('id')
|| ($this->input->getMethod() === 'POST'
&& (($vName === 'category' && $this->input->get('layout') !== 'blog') || $vName === 'archive'))
) {
$cachable = false;
}
Der Ausdruck $user->get('id') ist wahr, wenn es sich um einen angemeldeten Benutzer handelt. Das bedeutet, dass Beiträge für angemeldete Benutzer niemals im Cache gespeichert werden. Die nachfolgenden Ausdrücke beziehen sich auf weitere Bedingungen, unter denen das Caching nicht durchgeführt wird, selbst wenn der Benutzer nicht angemeldet ist.
Auf diese Weise lässt sich also herausfinden, unter welchen Umständen Caching durchgeführt wird, es wird jedoch nicht empfohlen, dies zu ändern. Man kann auch zeigen, dass Module zwischengespeichert werden, indem man das Joomla Breadcrumbs-Modul verwendet, es in einer Modulposition der Webseite anzeigen lässt, dessen Caching-Option einstellt und die zwischengespeicherte Datei in cache/mod_breadcrumbs manuell bearbeitet.
Progressives Caching
Wie Konservatives Caching speichert auch Progressives Caching die Ausgabe von Komponenten-Views und Modulen zwischen. Der funktionale Unterschied zwischen beiden besteht darin, dass bei Progressivem Caching für abgemeldete Benutzer alle Module immer zwischengespeichert werden. In diesem Fall hat die Einstellung der Option Kein Caching für ein Modul keine Wirkung. Wenn als Cache-Speicheroption Datei eingestellt ist, findet sich die Cache-Datei der Module (die Ausgabe aller Module wird in derselben Datei gespeichert) im Verzeichnis cache/com_modules.
Um Progressives Caching zu aktivieren, navigiert man zu Administrator → System → Allgemeine Einstellungen → Reiter System und stellt dort unter Cache-Einstellungen den System-Cache auf EIN – Progressives Caching.
Was die Bedingungen für das Caching von Joomla-Core-Komponenten-Views betrifft, gibt es keinen Unterschied zwischen konservativem und progressivem Caching. Entgegen dem, was man auf manchen Webseiten und in Antworten auf Stack-Overflow-Fragen lesen kann, trifft es nicht zu, dass sich Konservatives Caching auf nicht angemeldete und Progressives Caching auf angemeldete Benutzer bezieht.
Zusammenfassung
Nachfolgend eine Zusammenfassung der Caching-Arten.
Gesamtseiten-Caching
- Konfiguration: Eingebautes Plugin (Administrator → Erweiterungen → Plugin-Verwaltung → System – Page-Cache)
- Speichert zwischen: jede gesamte Seite der Website
- Basierend auf: URL
- Weitere Informationen:
- Optionales Browser-Caching: Speichert auch im Browser/Computer der Besucher zwischen
- Speichert nur Seiten für Gastbesucher zwischen (nicht für angemeldete Besucher). Vorsicht bei Verwendung dieses Plugins auf einer interaktiven Website, bei der Inhalte auf Basis von Sitzungs-/Cookie-Informationen statt nur der reinen URL ausgeliefert werden sollen. Funktionen wie ein Warenkorb funktionieren dann nicht.
View-Caching
- Konfiguration: Allgemeine Einstellungen -> Cache
- Speichert zwischen: jeden View einer Komponente
- Basierend auf: URL, View, Parameter, ...
- Weitere Infos: Komponentenentwickler müssen dies in ihrem Code berücksichtigen, damit es funktioniert. Meistens wird dies nicht gemacht. Die Hauptinhaltskomponente von Joomla nutzt dies, allerdings nur für Gastbesucher der Website, auch wenn dies nicht für jede Komponente verpflichtend ist.
Modul-Caching
- Konfiguration: Allgemeine Einstellungen -> Cache
- Zwischengespeichert wird: jedes Modul (individuell anpassbar über die erweiterten Parameter jedes Moduls)
- Basierend auf: der Modul-ID, den Zugriffsebenen des Benutzers und dem Parameter Itemid in der HTTP-Anfrage
- Weitere Infos: Bei manchen Modulen muss dies deaktiviert werden, um Probleme zu vermeiden
Weiteres Caching
Wer andere Cache-Systeme und Möglichkeiten erkunden möchte, sollte sich die Drittanbieter-Erweiterungen rund um das Caching ansehen.
Caching-Engines oder -Speicher
- Konfiguration: Allgemeine Einstellungen -> Cache
Hier kann ausgewählt werden, welches System die Website für das gesamte Caching verwenden soll. Einige Optionen sind: APC, Eaccelorator, File, Memcache, Redis, XCache.
APC zum Beispiel speichert auch den PHP-Opcode zwischen.
Für Entwickler
Die Klasse JCache ermöglicht viele verschiedene Arten und Ebenen des Cachings. Die folgenden Unterklassen wurden speziell dafür erstellt, aber es können auch eigene hinzugefügt oder die Hauptklasse auf vielfältige Weise verwendet werden.
Nicht vergessen: Die erste angetroffene Cache-Ebene überschreibt jede tiefere Caching-Ebene. Zu viele Ebenen dürften ebenfalls kontraproduktiv sein (dies ist jedoch noch zu überprüfen).
- JCacheView speichert die Ausgabe einer gegebenen View (im MVC) zwischen und gibt sie zurück. Eine Cache-ID wird automatisch aus der URI, der jeweiligen View und ihrer jeweiligen Methode generiert, oder es kann eine eigene angegeben werden.
Dies kann automatisch über die display-Funktion des Basis-Controllers erfolgen. Zum Beispiel im Controller der Komponente:
class DeliciousController extends JController {
function display() {
parent::display(true); //true asks for caching.
}
}
Außerdem sind einige URL-Parameter zu beachten. Siehe hierzu Joomla StackExchange
Zudem ist zu beachten, dass Aktualisierungen (wie Zugriffs- oder Besucherzähler) NICHT aktualisiert werden (es sei denn, dies wird außerhalb dieser Methode und somit außerhalb eines tieferen MVC-Teils hinzugefügt).
- JCachePage speichert den Inhalt der Seite zwischen und gibt ihn zurück.
- JCacheCallback speichert die Ausgabe und Ergebnisse von Funktionen oder Methoden zwischen und gibt sie zurück.
Wer Datenbankabfragen zwischenspeichern möchte, findet hier eine gute Klasse dafür, wie hier veranschaulicht: Using caching to speed up your code
- JCacheOutput speichert Ausgaben zwischen und gibt sie zurück.
Dies ist eher für das Zwischenspeichern eines bestimmten Teils von PHP-Code gedacht. Es funktioniert wie ein Ausgabepuffer, jedoch zwischengespeichert.