Caching kurzlebiger Inhalte (z.B. News)

Ein typischer Fall, in dem Kunden und Entwickler das Caching von TYPO3 bisher verfluchten, war die Nutzung eines Plugins wie tt_news, bei dem sich die anzuzeigenden Datensätze zwar geändert hatten, die Aktualisierung des Caches aber erst nach Ablauf dessen Gültigkeitszeitraums  erfolgte. (Die Möglichkeit, generell den Cache zu deaktivieren, ist böse und wir daher nicht näher betrachtet). Über die Einstellung TCEMAIN.clearCacheCmd auf der Seite, die die Datensätze enthält, ließ sich zwar der Cache einzelner (oder aller) Seiten bei Änderungen invalidieren, jedoch ist dies nicht wirklich sinnvoll und praktikabel:

  • Man muss entweder die Liste der Seiten-IDs pflegen oder mittels „all“ den Cache aller Seiten lsöchen, unahängig davon, ob das Plugin dort überhaupt eingesetzt ist.
  • Man löscht stets den Cache der gesamten Seite, obwohl sich ja nur ein Inhaltselement aktualisieren soll.

Ende Februar hatte Fabrizio in seinem Blog eine Idee vorgestellt, wie auf Contentelement-Ebene ein individuelleres Caching ermöglicht werden könnte. Diese stieß auf viel Interesse und schaffte es schnell in den TYPO3-Core (4.7), auch ein Backport in 4.5 und 4.6 ist vorgesehen.

Um was geht’s nun genau?

cObject (also alle Inhaltselemente) hat eine neue Funktion cache bekommen mit den Eigenschaften key, lifetime und tag. Die Cache-Funktion greift auf das Caching Framework zurück (seit 4.7 defaultmäßig aktiv). Bei deaktivtem Caching Framework wirkt sich die Funktion negativ aus, da das cObject dann gar nicht mehr gecacht wird.

  • key setzt den eindeutigen Identifier (ID) im Cache
  • lifetime legt fest, wie lange der Cache gültig bleibt
  • tag definiert eine (kommaseparierte) Liste von Tags, anhand derer auf den Cache zugegriffen werden kann (z.B. zum Leeren)

Anwendung

Kommenw ir auf das beispiel der News-Artikel zurück. Nehmen wir an, die aktuellsten Artikel sind in der Randspalte unserer Seite eingebunden. Für die normale Listenansicht wird bereits bei Änderungen der Seitencache dieser Seite gelöscht. Nun sollen aber auch die Inhalte der Randspalte sich aktualisieren. Dafür braucht es zwei Schritte:

Cache-Funktion verwenden

temp.newsLatest < plugin.tt_news
// ...
temp.newsLatest {
	cache.key = ttnewsLatest
	cache.tags = ttnews,ttnewsLatest
	cache.lifetime = 3600
}

Cache leeren bei Änderungen

Was bislang (noch) nicht dokumentiert ist, ist die Möglichkeit zum Löschen von Caches via CacheId bzw. CacheTags. Diese wurde in einem Feature-Request behandelt und auch bereits im TYPO3-Core enthalten. Die Syntax ist vorgesehen als:

TCEMAIN.clearCacheCmd = cacheTag:firsttag,cacheTag:secondtag
TCEMAIN.clearCacheCmd = cacheId:first,cacheId:anotherid

Für unser Beispiel brauchen wir also auf der Seite der News-Datensätze im Page TSconfig den Eintrag:

TCEMAIN.clearCacheCmd = cacheTag:ttnews,cacheTag:ttnewsLatest

Quellen