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

Das könnte dich auch interessieren …

7 Antworten

  1. Felix Nagel sagt:

    Hey Julian, hab den Post irgendwie aus den Augen verloren. Ich glaube bisher gibts auch noch nichts neues oder?

    Mir wäre vor allem daran gelegen Plugins auf einer Seite genauer zu konfigurieren ohne eigenes Caching implementieren zu müssen.

    • Julian sagt:

      Habe das ganze Thema (obwohl recht interessant) leider auch nicht mehr weiter verfolgt bzw. verfolgen können.

      Gehört/Gelesen habe ich dazu nebenbei auch nichts Neues.

  2. Julian sagt:

    Update:
    Zumindest auf Seiten-Ebene werden die CacheTags in der 6.0 im Core integriert sein.
    Für tt_content hab ich nicht gesehen (man möge mich korregieren).

  3. Julian sagt:

    Dass es (noch) nicht tiefer integriert ist, könnte dran liegen, dass dieses Feature es gerade noch vor dem Feature-Freeze in die 4.7 geschafft hat (am 27.2. integirert, am 28.2. war Freeze). Daher kann es sein, dass da noch niemand dran dachte, oder aber niemand schnell genug den Code dafür geschrieben hat.
    Hab mir die Version 6 noch nicht angeschaut. Vielelicht ists dort ja schon weiter integriert (und falls nicht, wäre das sicherlich eine guter Feature-Request).

    Denke, im BE wären solche Einstellungen zumindest nicht für ganz einfache Redakteure sinnvoll. Mit steigender Ausgefeiltheit des Cachings ist hier auch immer mehr Wissen nötig, was wie greift. Aber das Feld ließe sich ja auch nur Admins odgl. zugänglich machen.

    Ja, genau, denke, via stdWrap odgl. sollte sich die Funktion hinzubauen lassen. Evtl. auch verknüpft mit selbst hinzugefügten Felder aus dem tt_content-Record. Aber wie gesagt, ist von mir bisher nur theoretische Überlegung.

  4. Felix Nagel sagt:

    Wow, dank3e für die schnelle Antwort. Mhh, du meinst das man das theoretisch per static TS und stdWrap konfigurieren können müsste?

    Mich verwirrt dabei einfach das es mit TS seit 4.7möglich ist, aber offensichtlich keiner dran gedacht hat das auch im BE pflegbar zu machen. Wobei technisch ja nichts dagegen spricht, oder?

    Eine andere Idee war EXT:typoscript_code zu nutzen. Wäre die Frage ob das wirklich funktioniert…

  5. Julian sagt:

    Jain. Via TS tut es auf alle Fälle, das habe ich so im Einsatz.

    Wie/Ob es CEs eingebunden werden kann, liegt vermutlich in guter Überlegung, wie sich der Key setzen/generieren lässt. Sollte aber, wenn ichs mir recht überlege, via irgendwelcher stdWrap-Eigenschaften auch in CE einzuklinken sein.

    Über Erfahrungsaustausch und weitere Überlegungen würde ich mich freuen. Denke, das ist ein noch junges Thema, mit dem man sicher aber durchaus befassen sollte.

  6. Felix Nagel sagt:

    Verstehe ich das richtig das es keine Möglichkeit gibt das am CE im BE zu pflegen? Man muss ein Plugin also per TS einbinden um die Möglichkeit zu haben, korrekt?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert