Caching in TYPO3


Einrichten eines eigenen Caches

Zuerst kann man in der ext_localconf.php eigene Caches registrieren. Dazu reicht folgender Code:

In der offiziellen Dokumentation von TYPO3 gibt es mehr Informationen zu den Optionen und Varianten. Es gibt beispielsweise schnelle und einfache Key-Value-Cache-Frontends, oder Variable-Frontends, in denen man JSON Objekte hinterlegen kann, die beim abfragen automatisch umgewandelt werden.

Zugriff mit der Caching API

Zuerst holen wir uns mit dem CachManager unseren Cache, sodass wir Werte im Cache lesen und schreiben/hinzufügen können:

Nun gibt es ein sehr geschicktes Konstrukt mit dem wir den Zugriff auf den Cache so bewerkstelligen, dass ein Wert (Zahl oder sogar ein ganzes gerendertes Template) aus dem Cache geladen wird, wenn es einen validen Eintrag gibt, und andernfalls der Wert berechnet (im Fall des Templates wird das Template gerendert) und direkt im Cache hinterlegt wird. So stellen wir sicher, dass ein Wert nur beim ersten Aufruf tatsächlich berechnet wird und danach aus dem Cache kommt.

Die Variable $uniqueIdentifier muss eindeutig den Wert beschreiben, den wir zurückgeben wollen. Eventuell ist das Plugin sehr komplex, für einen einzelnen Benutzer aber immer gleich. Deshalb würde sich die fe_user ID anbieten.

Wir wollen in einer ControllerAction das HTML eines Plugins ausgeben. Dafür wird im Kopf des IF-Schleife versucht, den Wert aus dem Cache zu laden. Klappt das, landet in $htmlOutput der Wert und die Bedingung schlägt fehl, also wird der Rumpf der IF-Schleife nicht ausgeführt. Es geht weiter mit dem return, was den Wert, den wir aus dem Cache haben einfach zurückgibt.

Schlägt die Variablen-Zuweisung im Kopf der IF-Schleife fehl, so ist die Variable leer, und wir landen im Rumpf der IF-Schleife, wo der Wert berechnet wird. Was hier passiert hängt davon ab, was ihr berechnet. Hinter der Methode renderPlugin() kann sich also beispielsweise das Rendern eines cObjects mittels GLOBALS['TSFE']->cObj->cObjGetSingle(...) verbergen.

Wann und wie leert man den Cache

Es hängt stark davon ab, wie die Daten, die man cachen möchte zur Verfügung stehen. Zum einen gibt es Daten, bei denen man mitbekommt, wenn sie sich ändern; dann muss der Cache geleert werden. Oder es sind Daten, bei denen man das nicht mitbekommt und reinschauen muss, ob sich etwas geändert hat. Hier ist die Schwierigkeit, das die Überprüfung auf Aktualität wesentlich schneller gehen muss, als die Daten von vorhinein neu zu berechnen.

Zwei Beispiele, wo wir für ein Dashboard unterschiedliche Kacheln haben, die einzeln gecacht werden sollen und wir das Ändern der Daten mitbekommen.

Es gibt eine Kachel, die das aktuelle Wetter anzeigt. Die Daten dafür werden einmal in der Stunde mit einem CommandController von einem Dienst abgeholt und in der Datenbank gespeichert (auch eine Art Caching). Es wäre also Quatsch bei jedem Laden des Dashboards diese Werte aus der Datenbank zu laden und die Kachel zu rendern.

Wir leeren den Cache für die Wetterkachel immer dann, wenn die neuen Werte abgeholt werden; also im CommandController. Nun muss die Kachel von irgendeinem Nutzer einmal geladen werden und ab da an, steht der gerenderte Inhalt der Kachel im Cach für alle zur Verfügung.

Das war ja recht einfach. Etwas komplizierter wird es, wenn wir für die unterschiedlichen News-Kacheln auf dem Dashboard den Cache leeren wollen. Der Cache muss immer dann aktuallisiert werden, wenn sich eine News ändert.

Hier hilft ein Hook im DataHandler (processDatamap_afterAllOperations). Wir prüfen, ob die es sich bei den Daten um Daten aus der Tabelle tx_news_domain_model_news handelt und leeren den Cache entsprechend.

Noch ein Beispiel, wo wir Änderungen an den Daten nicht mitbekommen und selbst nachschauen müssen.

Wir durften einen Importer für Personendaten entwickeln, der für eine jede Person eine XML-Datei vom Server holt, den Inhalt parst und ein Modell mit den Werten füllt. Nun wäre es recht aufwendig jedesmal das XML zu parsen und die einzelnen Werte zu vergleichen, ob sich etwas geändert hat. Da es egal ist, ob sich ein Wert oder alle Werte geändert haben hashen wir die Datei. Das geht selbst mit PHP ruck-zuck und ist schnell verglichen, ob der gespeicherte Hash mit dem der neu angekommenen Datei übereinstimmt.

Hat dir der Artikel gefallen?

Werkraum News: