T3 Campus T3 Campus

TYPO3 Caching Framework nutzen

Nutze das Caching Framework in deiner TYPO3 Erweiterung, um die Leistung deiner Webseite zu optimieren.

Was ist ein TYPO3 Caching Framework?

TYPO3 nutzt mehrere Caching-Strategien, um eine TYPO3 Webseite zu beschleunigen. Das erhöht die Benutzerbarkeit deiner Webseite und ist ein Pluspunkt im Google Ranking.

In deiner eigenen Extbase Erweiterung kannst du das Caching Framework von TYPO3 für deine eigenen Zwecke nutzen und gezielte Teile zwischenspeichern.
Das kann sinnvoll sein, um beispielsweise Anfragen auf externe Services zu minimieren oder komplexere Algorithmen nur dann neu zu durchlaufen, wenn es unbedingt notwendig ist.

Warum sollte man das TYPO3 Caching Framework verwenden?

Deine Erweiterung unterliegt standardmäßig dem normalen Seitencache von TYPO3. Wenn du Frontend Plugins in Extbase erstellst, dann kannst du selbst definieren, welche Actionmethoden gecacht werden sollen.

Dieser Standardcache speichert allerdings das komplette Ergebnis, also den fertigen HTML-Teil. Mithilfe des Caching-Frameworks kannst du auch einzelne Funktionen oder Algorhitmen umgehen, indem du diese Ergebnisse speicherst.

Es kann zum Beispiel notwendig sein, dass du den TYPO3 Cache der Actionmethode deaktivieren musst, weil es mit Daten arbeitet, die der Benutzer eingibt, wie bei Formularen. 

Wenn du in diesen Actionmethoden ein Prozess anstößt, wie das Anfragen von Ressourcen, und diese cachen möchtest, dann musst du auf das Caching Framework von TYPO3 zurückgreifen.

Wie kann man das TYPO3 Caching Framework nutzen?

Das Caching Framework lässt sich in TYPO3 nutzen, indem du deinen Cache Konfiguration registrierst und eine Caching-Instanz einer eigene PHP Klasse bildest.Danach kannst du auf deinen Cache lesend und schreibend zugreifen. Das Grundprinzip ist dabei denkbar einfach.

Cache registrieren

Die Registrierung eines Cache wird in der ext_localconf.php deiner Extension vorgenommen:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['myext_mycache'] ??= [];

Danach muss man in seiner Services.yaml Datei unterhalb vom Configuration Ordner folgende Einträge vornehmen:

services:
  ...
  cache.myext_mycache:
    class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
    factory: ['@TYPO3\CMS\Core\Cache\CacheManager', 'getCache']
    arguments: ['myext_mycache']
  
  Vendor\MyExtension\MyClass:
    arguments:
      $cache: '@cache.myext_mycache'

Damit registriert du deinen eigenen Cache Service, welche über eine PHP Klasse umgesetzt werden muss. Im obigen Beispiel ist das die Klasse: Vendor\MyExtension\MyClass. Dieser Pfad müsstest du dann ersetzen.

Jede Cache-Konfiguration bekommt einen Identifier. Den kannst du selber wählen, aber er muss dann überall geändert werden in der YAML - Konfiguration. Im obigen Beispiel ist der Identifier: cache.myext_mycache

Die PHP Klasse sieht dann ungefähr so aus:

namespace Vendor\MyExtension\Cache;

use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;

class MyCache
{
    public function __construct(
        private readonly FrontendInterface $cache
    )
    {
    }

    private function getCachedValue()
    {
        $cacheIdentifier = /* ... logic to determine the cache identifier ... */;

        // If value is false, it has not been cached
        $value = $this->cache->get($cacheIdentifier);
        if ($value === false) {
            // Calculate the value and store it in the cache
            $value = /* ... Logic to calculate value ... */;
            $tags = /* ... Tags for the cache entry ... */;
            $lifetime = /* ... Calculate/define cache entry lifetime ... */;

            // Store value in cache
            $this->cache->set($cacheIdentifier, $value, $tags, $lifetime);
        }

        return $value;
    }

Du kannst dann auch eine Methode: function setCacheValue($identifier, $value, $tags, $lifetime) erstellen, um direkt in den Cache zu schreiben. Dir steht es frei, um die Klasse um weitere Methoden zu erweitern.

Wichtige Parameter beim Setzen eines Cacheeintrags sind:

  • identifier
  • tags
  • lifetime

Der identifier ist der Name, unter dem du deinen speicherten, Wert wiederfinden kannst. Das ist sozusagen die ID deines gecachten Wert. Wenn du den identifier mehrfach verwendest, dann werden die Werte überschrieben.

Der tags Parameter ist eine Liste von Schlagwörtern. Du kannst deinen Cache nicht nur komplett leeren, sondern auch nur die Cacheeinträge mit einem speziellen Cachetag. Dadurch kannst du Cacheeinträge gruppieren und gezielt leeren.

Du kannst jetzt deinen Caching-Service über die Injection an beliebiger Stelle instanziieren und nutzen:

namespace Vendor\MyExtension;

use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;

class MyClass
{
    /**
     * @var \Vendor\MyExtension\Cache\MyCache
     */
    protected $cacheService;

    public function injectCacheService(\Vendor\MyExtension\Cache\MyCache $cacheService)
    {
        $this->cacheService = $cacheService;
    }
}

Alternativ ist auch eine Instanzierung über den ObjectManager möglich.

Was muss man bei der Verwendung des Caches beachten?

Wie bei fast allem im Leben muss man mit einem gesunden Maß arbeiten. Caches sind dafür da, um aufwendige Prozesse nicht immer wieder durchlaufen zu müssen. Den Zwischenspeichern dieser Prozesse lohnt sich nur dann, wenn der Aufwand des Cachings kleiner ist als der Prozess, den man cached.

Darüber hinaus kann man nur diese Teile cachen, deren Ergebnisse nicht an dynamische Werte, wie aus Formularen, gebunden sind.

Auch der Einsatz von zu vielen Caches kann das System negativ belasten. Hier gilt es Tests durchzuführen und die Renderingzeit im Auge zu behalten. Das geht ganz gut mit Google Chrome Lighthouse.

Du musst ebenfalls darauf achten, welche Werte zu speicherst. Du kannst nur die Variablen bzw. Informationen speichern, die sich serialisieren lassen. Das bedeutet als String dargestellt werden können.

Die Cachedaten sollten somit Stringwerte sein bzw. Werte, die als String dargestellt werden können. Das sind beispielsweise:

  • Buchstaben
  • Zahlen
  • Arrays aus Buchstaben und Zahlenwerten (JSON)

Komplexe Objekte sollte man nicht in den Cache speichern. Besser ist die Werte dieser Objekte in ein JSON Objekt zu konvertieren und beim Laden aus dem Cache wieder in ein Objekt zu verwandeln.

Fazit

Das Cache-System bzw. die Cachesysteme sind in TYPO3 sehr ausgefeilt und führen dazu, dass TYPO3 zu den schnellsten Content Management Systemen gehört. Die Zeiten, dass TYPO3 als langsam gilt, ist lange vorbei.

Du kannst als Entwickler darüber hinaus mit dem Caching Framework deine eigenen Caches schreiben und selbst entscheiden, welche Teile deiner Erweiterung gecacht werden soll.

Damit bietet dir TYPO3 ein sehr gutes Werkzeug, um deine Webseite zu optimieren.

Bereit mehr zu lernen?

Dann komme in meine TYPO3 Onlineschule

Als Mitglied des T3 Campus für TYPO3 Schulungen erhältst du eine einzigartige Lernplattform, um professionelle Webseiten mit TYPO3 zu erstellen. Egal, ob du ein Einsteiger, Umsteiger oder bereits erfahren bist – hier findest du die passenden Lernvideos für dich.

Kevin Chileong Lee

Gründer vom T3 Campus, TYPO3 Experte mit 10+ Jahren Erfahrung, TYPO3 Liebhaber.

Ich helfe dir dabei, deine Projekte in TYPO3 umzusetzen.

Insbesondere für TYPO3 Einsteiger biete ich zahlreiche kostenfreie Tutorials und kostenpflichtige Kurse rund um TYPO3 an.
Damit kannst du in wenigen Tagen auch ohne Vorkenntnisse deine erste TYPO3 Webseite erstellen und Erweiterungen programmieren.

Auf meinem YouTube-Kanal findest du viele praktische Beispiele und Videotutorials als auch allgemein Videos zu diversen TYPO3 Themen.

Neber den TYPO3 Tutorials und Kopiervorlagen, schreibe ich auch Artikel auf meinem Blog über diverse Themen und Fragen, die die meisten TYPO3 Einsteiger, haben.

Falls du ein TYPO3 Coaching suchst, dann stehe ich dir in einer 1:1 Trainingssession zur Verfügung.

Wenn du auf dem Laufenden sein möchtest über meine Projekte, dann abonniere den Newsletter.