Newsübersicht

Frontend-Caching mit TYPO3 13.4: Architektur, Auto-Tagging und Best Practices

Mit TYPO3 13.3 und 13.4 hat das Frontend-Caching ein großes Upgrade erhalten: Das neue Auto-Tagging versieht Seiten und Inhalte automatisch mit präzisen Cache-Tags – und sorgt dafür, dass geänderte Datensätze sofort die richtigen Cache-Einträge invalidieren. Das Ergebnis: Deutlich gesteigerte Website-Performance, weniger manueller Aufwand sowie zuverlässigeres Caching im Tagesgeschäft.

Verfasst von
Andre Westbunk
Datum

In diesem Beitrag erfährst du detailliert, wie das Frontend-Caching in TYPO3 v13 funktioniert, wie Auto-Tagging technisch arbeitet und was du tun musst, wenn bestimmte Daten dennoch nicht automatisch getaggt werden.

Was macht Auto-Tagging in TYPO3 13.4 - und was musst du noch selbst erledigen?

Kurz gesagt: In TYPO3 13.4 sammelt das Frontend beim Rendern alle „benutzten“ Datensätze, hängt Cache-Tags an den Seitencache und löscht die betroffenen Einträge automatisch, wenn sich diese Datensätze ändern (Auto Tagging). Für alles, was nicht automatisch erkannt wird, musst du selbst Cache-Tags über den Frontend Cache Collector setzen und - falls es keine TYPO3-DB-Datensätze sind - beim Update die Caches per CacheManager anhand  der Cache-Tags leeren.

1. Architektur des Frontend-Cachings in TYPO3 13

1.1 Caching Framework Grundprinzip

TYPO3 hat ein generisches Caching-Framework mit beliebig vielen Caches (page cache, content cache, eigene Extension-Caches etc.). Ein Cache-Eintrag besteht immer aus: Identifier, Daten, Lifetime und Tags. Cache-Tags dienen dem gezielten Löschen (Eviction), nicht dem Lesen. Cache-Backends, die das Interface TaggableBackendInterface implementieren, unterstützen das Handling von Cache-Tags, z.B. mittels der Methoden flushByTag() oder flushByTags().

1.2 Relevante Frontend-Caches

Für dich als Integrator/Entwickler sind vor allem wichtig:

  • Seitencache (klassischer cache_pages sowie ggf. weitere gruppierte Caches)
  • Content/Partial-Caches (z.B. für einzelne Inhaltselemente / ContentObjects)
  • Eigene Caches deiner Extensions (optional)

Alle diese Caches können mit Tags versehen werden, wenn das Backend TaggableBackendInterface unterstützt.

1.3 Request-Attribute im Frontend

Seit TYPO3 v13 wird das Caching über PSR-7 Request-Attribute gesteuert:

frontend.cache.instruction
Die Angabe der Cache-Instruction steuert, ob überhaupt gecached werden darf. Alte TYPO3-Hasen kennen das noch unter $TSFE->no_cache. Middlewares können damit das Caching deaktivieren (z.B. Admin Panel, ungültiger cHash etc.).

frontend.cache.collector
Sammelt Cache-Tags und die zugehörige Lifetime für den aktuellen Request. Das ist der zentrale Einstiegspunkt für dich zum Taggen. Das folgende Beispiel zeigt exemplarisch die Anwendung des CacheDataCollectors:

 

use TYPO3\CMS\Core\Cache\CacheTag; 

$collector = $request->getAttribute('frontend.cache.collector'); 
$collector->addCacheTag(     
	new CacheTag('tx_myextension_mytable')
); 

 

Die Berechnung der Cache-Lifetime übernimmt der Collector. Dabei wird die minimale Lifetime einer Seite auf Basis der kürzesten CacheTag-Lifetime berechnet. Die Standard-Lifetime eines CacheTags ist derzeit PHP_INT_MAX, also „sehr lange“.

Am Ende der Rendering-Chain werden auf Basis von frontend.cache.instruction und frontend.cache.collector die passenden Cache-Einträge geschrieben.

2. Automatic Frontend Cache Tagging („Auto-Tagging“)

2.1 Was macht Auto-Tagging genau?

Seit TYPO3 13.3 gilt:

„When database records are used in the frontend, and the rendered result is put into caches like the page cache, the TYPO3 frontend now automatically tags cache entries with lists of used records. When changing such records in the backend, affected cache entries are dropped, leading to automatic cache eviction.“ 

Konkret heißt das:

  • Wenn ein Datenbank-Datensatz im Frontend verwendet wird und das Ergebnis im Seitencache landet, dann versieht TYPO3 den Cache-Eintrag automatisch mit CacheTags, die zu diesen Datensätzen gehören.
  • Ändert ein Redakteur diese Datensätze im Backend, löscht TYPO3 die betroffenen Cache-Einträge automatisch. Der DataHandler ruft dabei intern die diversen CacheManager::flushCaches*() Methoden auf, z.B.  CacheManager::flushCachesByTag()

Das ist ein massiver Komfortgewinn gegenüber früher, wo man selbst CacheTags vergeben und beim Speichern wieder suchen/löschen musste.

2.2 Feature Toggle frontend.cache.autoTagging

Die Verfügbarkeit des Auto-Tagging wird über das Feature-Flag frontend.cache.autoTagging gesteuert. Generell ist das Feature bei neuen TYPO3 v13 Installationen aktiviert. Bei TYPO3-Systemen, die per Upgrade auf Version 13 aktualisiert wurden, ist Auto-Tagging nicht aktiviert und muss über die Settings aktiviert werden, vgl. Feature: #104990 - Automatic frontend cache tagging

Typische Konfiguration (config/system/settings.php):

 

return [
    'SYS' => [
        'features' => [
            'frontend.cache.autoTagging' => true,
        ],
    ],
];

 

2.3 Wo greift Auto-Tagging heute?

Die Implementierung steckt primär dort, wo TYPO3 „weiß“, welche Datensätze du nutzt, u.a.:

  • Extbase-Persistenz: Die Klasse Typo3DbBackend hat eine autowired-Property $autoTagging, das direkt an das Feature frontend.cache.autoTagging gekoppelt ist. (api.typo3.org)
  • Core-Komponenten, die DB-Records für das Frontend holen und ihrerseits in das Caching-Subsystem integriert sind.

Das heißt: Wenn du „normal“ mit Extbase-Repositories, TCA-basierten Tabellen & Core-APIs arbeitest, profitierst du automatisch von Auto-Tagging, ohne irgendetwas zu tun.

3. Wann werden Daten nicht automatisch getaggt?

Auto-Tagging kann nur Daten erfassen, die TYPO3-intern als „DB-Record X wurde benutzt“ erkennt. Typische Fälle, in denen das nicht passiert:

Daten kommen nicht aus einer TYPO3-DB-Tabelle, z.B.:

  • externe REST-APIs
  • eigene Microservices
  • Files oder JSON/YAML, die du direkt einliest

Du nutzt eigene DB-Zugriffe, die Auto-Tagging umgehen, z.B.:

  • direkter Zugriff via ConnectionPool / QueryBuilder ohne integrierte Auto-Tagging-Layer
  • eigene PDO-/mysqli-Verbindungen außerhalb des TYPO3-DBAL (Database Abstraction Layer)

Aggregierte/abgeleitete Daten, bei denen nicht klar ist, welche einzelnen Datensätze gemeint sind, z.B. „Top 10 Produkte der letzten 24h

Caches mit Backends ohne Tag-Unterstützung, z.B. SimpleFileBackend, das bewusst nicht TaggableBackendInterface implementiert.

In all diesen Fällen musst du selbst nachhelfen.

4. Was tun, wenn bestimmte Daten nicht automatisch getaggt werden?

Schritt 1: Prüfen, ob Auto-Tagging aktiviert ist

In config/system/settings.php oder im Install Tool nachsehen:

 

'SYS' => [
	'features' => [
		'frontend.cache.autoTagging' => true,
	],
], 

 

Cache-Verhalten testen

  • Einfache Extbase-Listen- oder Detail-Views mit DB-Datensätzen aufsetzen.
  • Seite aufrufen → im Backend Datensatz ändern → prüfen, ob der Seitencache geleert wird (z.B. indem sich der Inhalt ohne manuelles Cache-Löschen ändert).

Wenn das schon bei „einfachen“ Fällen nicht funktioniert, prüfe zunächst die Konfiguration und korrigiere sie, bevor du weitere Schritte unternimmst.

Hinweis: Denk daran, dass du in einem anderen Browser oder im Incognito-Modus das Frontend testen musst. Frontend-Requests, die bei gleichzeitig aktiver Backend-Session abgerufen werden, werden niemals gecached.

Schritt 2: Eigenes Tagging mit dem Frontend Cache Collector ergänzen

Für alle Daten, die Auto-Tagging nicht abdeckt, benutzt du den frontend.cache.collector direkt, um die CacheTags manuell zu setzen.

Collector Instanz aus dem aktuellen Request holen

In einer PSR-15 Middleware oder sonstigem Code mit Request-Parameter:

 

use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Cache\CacheTag;

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
    $collector = $request->getAttribute('frontend.cache.collector');

    // Beispiel: externer API-Datensatz mit ID $itemId
    $collector->addCacheTags(
        new CacheTag('external_item_' . $itemId),
    );

    return $handler->handle($request);
}

 

In Kontexten ohne direkten Request-Parameter (z.B. DataProcessor, Hooks) kannst du als Fallback das globale Request-Objekt nutzen:

 

use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Cache\CacheTag;

/** @var ServerRequestInterface $request */
$request = $GLOBALS['TYPO3_REQUEST'];
$collector = $request->getAttribute('frontend.cache.collector');

$collector->addCacheTags(
    new CacheTag('external_item_' . $itemId),
);

 

Mehrere Tags / Lifetime setzen

Beispiel

 

$collector->addCacheTags(
    new CacheTag('tx_myext_article_123', 3600),      // 1 Stunde
    new CacheTag('tx_myext_category_45', 86400),     // 1 Tag
);

 

Der Collector berechnet dann auf Seiten, denen diese Tags zugewiesen sind, automatisch die minimale Lifetime anhand der geringsten Lifetime. In diesem Beispiel wären das 3600 Sekunden.

Schritt 3: Sinnvolle Tag-Namenskonvention wählen

Bewährt ist ein Schema wie bei der Extension News von Georg Ringer. Hier wird z.B. tx_news_pid_<PID> als Tag genutzt: Seite(n) mit News-Listen werden damit gekennzeichnet, beim Ändern einer News im entsprechenden Storage-Folder wird über diesen Tag der Cache geleert.

Für eigene Daten:

  • Pro Datensatz tx_myext_domain_model_foo_<uid>
  • Pro Container / Ordner / Filter tx_myext_foo_pid_<pid>, tx_myext_foo_category_<catUid>

So kannst du bei Änderungen die Cache-Einträge einer Detailseite eines Datensatzes über den „Einzel-Tag“ sowie für Listen/Übersichten über die „Container“-Tags (PID, Kategorie etc.) invalidieren.

Schritt 4: Cache beim Ändern der Daten per Tag löschen

Auto-Tagging kümmert sich nur zuverlässig um TYPO3-DB-Records, die vom System erkannt werden. Für andere Datenquellen musst du das Löschen selbst anstoßen. Dazu nutzt du den CacheManager:

 

use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;

// z.B. nach Import eines externen Datensatzes
$cacheManager = GeneralUtility::makeInstance(CacheManager::class);

// Alle Caches mit diesem Tag leeren
$cacheManager->flushCachesByTag('external_item_' . $itemId);

// Oder nur Caches in der Gruppe "pages" leeren (Seitencache)
$cacheManager->flushCachesInGroupByTag('pages', 'external_item_' . $itemId);

 

Typische Orte für diesen Code:

  • Scheduler-Task, der externe Daten importiert/aktualisiert
  • Webhook-/Reactions-Handler (z.B. wenn externe Systeme TYPO3 informieren)
  • Backend-Modul oder DataHandler-Hook, wenn deine Daten als TYPO3-Records gepflegt werden

Schritt 5: Prüfen, ob dein Cache-Backend Tagging unterstützt

Für Page/Content-Caches ist das standardmäßig der Fall. Falls du aber eigene Caches definierst, achte darauf, einen Backend-Typ zu verwenden, der TaggableBackendInterface implementiert (z.B. DB-, Redis- oder File-Backend, nicht SimpleFileBackend).

Sonst können Tags zwar gesammelt, aber nie gezielt geleert werden.

Zusammenfassung


Was TYPO3 13.4 automatisch für dich erledigt

Wenn du mit Standard-DB-Tabellen und Extbase/Core-APIs arbeitest und frontend.cache.autoTagging aktiv ist, werden Seiten- und Content-Caches automatisch mit passenden Tags versehen. Änderungen an diesen Records führen automatisch zur Cache-Leerung der betroffenen Seiten.


Was du tun musst, wenn manche Daten nicht automatisch getaggt werden:

  • Prüfen, ob das Feature-Flag aktiviert ist (frontend.cache.autoTagging => true) und Basisfunktion testen.
  • Für alle „Sonderfälle“ (externe APIs, eigene Queries, Aggregationen) im Frontend: Über frontend.cache.collector eigene Cache-Tags hinzufügen.
  • Beim Aktualisieren dieser Daten mittels CacheManager::flushCachesByTag() oder flushCachesInGroupByTag('pages', ...) die Tags wieder aus allen relevanten Caches herauswerfen.
  • Gute Tag-Namenskonvention benutzen (z.B. pro Datensatz + pro Sammelkontext wie PID oder Kategorie).

Damit nutzt du den Komfort des neuen Auto-Taggings und schließt gezielt die Lücken für Cache-Zusammenhänge, die TYPO3 nicht selbst erkennen kann.

Weiterführende Informationen, Quellen und lesenswerte Artikel