Typo3 - Caching in Extensions
Links[Bearbeiten]
http://www.typo3-handbuch.de/index.php?id=164
http://www.sk-typo3.de/Richtiges-Cachen-mit-pi_base.188.0.html
http://www.sk-typo3.de/COA_INT-in-Extensions.190.0.html
Caching in Typo3[Bearbeiten]
no_cache[Bearbeiten]
Das Caching in Typo3 läßt sich auf verschiedene Arten ausschalten:
- no_cache=1 Parameter in der URL
- Seiteneigenschaften
- set no Cache Funktion
- TypoScript
Hierbei wird die komplette Seite bei jedem Aufruf neu berechnet. Die Performance nimmt dabei drastisch ab. Deshalb wird das Ausschalten des Seitencaches nicht empfohlen.
USER_INT / COA_INT[Bearbeiten]
Bei USER_INT Objekten wird die Seite Gechachet und für das USER_INT Objekt ein Platzhalter hinterlegt. Es wird nur der Teil des USER_INT Objektes jedesmal neu berechnet.
Dies sollte nicht gemeinsam mit cHashing verwendet werden.
Damit das Plugin richtig als USER_INT Objekt behandelt wird muß folgendes beachtet werden:
var $pi_checkCHash = FALSE; var $this->pi_USER_INT_obj = 1;
Hier kann es notwendig sein in der localconf das Plugin auf USER_INT umzustellen. Der letzte Parameter ist ausschlaggebend.
t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_myExtKey_pi1.php', '_pi1', 'list_type', 0);
cHash[Bearbeiten]
Bei USER Objekten kommt das Caching mit cHash zum Tragen. Dabei wird jede Seite mehrfach gespeichert. Und zwar gibt es für jede Kombination der POST/GET Parameter eine Version der Seite.
Sinnvoll ist dies wenn eine Seite bei einer Parameter-Kombination immer die gleichen Ergebnisse erzielt. Bei Hochdynamischen Seiten (Forum etc.) Wo sich dauernd etwas ändert ist das USER_INT Objekt vorzuziehen.
var $pi_checkCHash = TRUE; var $this->pi_USER_INT_obj = 0;
und in der localconf:
t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_myExtKey_pi1.php', '_pi1', 'list_type', 1);
Praxis[Bearbeiten]
Eine typische Anforderung ist eine Extension mit Suchformular, eine Ergebnisliste und viele Detailansichten. Die Detailseiten sollen gecachet und durchsuchbar sein, aber die Form und die Ergebnisliste sollen nicht gecachet werden. Wie soll das gehen.
Eine Möglichkeit ist es 2 Plugins in die Extension zu nehmen und diese unterschiedlich zu cachen.
Eleganter ist allerdings ein Caching mit USER/USER_INT Switch
Caching immer dann wichtig wird, wenn ein Link oder ähnliches geklickt wird und die aufgerufene Seite (auch wenn es die selbe ist) dementsprechend aus dem Cache kommt oder neu gerechnet wird. Dies hängt davon ab was unsere Zielseite anzeigen soll. Dazu erzeugen wir bei Bedarf ein USER_INT Objekt und müssen darauf achten, das die Links auf der Seite korrekt erzeugt werden. Muß also auf zwei Dinge achten Das das so ist ist historisch begründet und leider etwas umständlich.
So gehts:
Wir arbeiten mit 2 Caching Parametern: der Funktionsparameter $cache ist Zuständig für die korrekte Linkerzeugung in den Linkfunktionen die Object-Variable $this->pi_USER_INT_obj ist dafür Zuständig den Inhalt entweder zu berechnen(Das Zielobjekt ist ein USER_INT Objekt) oder aus der Datenbank zu holen (das Zielobjekt ist ein USER Objekt).
cHash links zu USER objects[Bearbeiten]
Links zu einem USER-Objekt brauchen einen cHash, wenn Du willst, das das Zielobjekt gecachet wird. Der cHash ist eine Versicherung, das der Aufruf gültige Parameter besitzt und die Datenbank in der Lage ist, die gewünschte Ansicht zu cachen. Um dieses zu erreichen musst Du folgendes setzen:
$cache =1 $this->pi_USER_INT_obj = 0
Einfache Links zu USER_INT-Objekten[Bearbeiten]
USER_INT Objekte werden niemals gecachet. So würde es auch keinen Sinn machen, sie mit einem cHash aufzurufen. Obwohl dieses keinen Sinn machen würde, kann man den cHash für diesen Fall verhindern.
$cache =0 $this->pi_USER_INT_obj = 1
Ergebnis[Bearbeiten]
So sieht das dann im Ergebnis aus:
class tx_myExtension extends tslib_pibase{
var $pi_checkCHash = TRUE; // if this is a USER plugin
var $this->pi_USER_INT_obj; // we don't set it here
...
function someFunction(...){
...
// link to USER
$cache = 1;
$this->pi_USER_INT_obj = 0;
$label = 'Link to USER plugin'; // the link text
$overrulePIvars = array( ... the parameters we need to send to the target plugin .... );
$clearAnyway=1; // the current values of piVars will NOT be preserved
$altPageId=33; // ID of the target page, if not on the same page
$link = $this->pi_linkTP_keepPIvars($label, $overrulePIvars, $cache, $clearAnyway, $altPageId);
...
// link to USER_INT
$cache = 0;
$this->pi_USER_INT_obj = 1;
$label = 'Link to USER_INT plugin'; // the link text
$overrulePIvars = array( ... the parameters we need to send to the target plugin .... );
$clearAnyway=1; // the current values of piVars will NOT be preserved
$altPageId=33; // ID of the target page, if not on the same page
$link = $this->pi_linkTP_keepPIvars($label, $overrulePIvars, $cache, $clearAnyway, $altPageId);
...
}
}
Caching in TYPO3-Extensions (Artikel)[Bearbeiten]
Michael Türk 29. Mai 2008
http://www.typo3-scout.de/2008/05/29/caching-in-typo3-extensions/
Wer einmal einen genaueren Blick auf die Abläufe im TYPO3-Frontend-Rendering geworfen hat, weiß, wie viele komplexe Vorgänge an der Ausgabe der TYPO3-Seiten beteiligt sind. Diese Komplexität steigt weiter, je mehr Extensions installiert sind. Würden TYPO3 Seiten bei jedem Aufruf neu aufgebaut, würde die Performance der Seiten erheblich Leiden und die Server hätten damit eher ihre Probleme. Außerdem funktioniert die Such-Indexierung nur dann, wenn die Inhalte zwischengespeichert werden.
Leider scheint das Caching an sich etwas zu wenig dokumentiert zu sein. Es finden sich immer wieder neue Extensions, welche die Caching-Mechanismen von TYPO3 nicht richtig einzusetzen verstehen. Dies liegt wahrscheinlich nicht zuletzt daran, dass die Schalter zum Aktivieren der Caching-Funktionalitäten recht gut versteckt und leicht zu übersehen sind.
Um die Performance von statischen Seiten zu verbessern, wird der fertig gerenderte HTML Code in der Datenbank abgelegt, um beim nächsten Abruf der Seite direkt aus der Datenbank geladen zu werden. Bei Extensions unterscheiden sich zwei verschiedene Vorgehensweisen:
1. Ein Großteil der Frontend-Plugins liefert bei gleichen Parametern immer gleiche Ergebnisse. Dies kennt man von News oder Shop-Systemen. Dies bedeutet, dass man die Ausgabe für verschiedene Parameter-Kombinationen jeweils im Cache ablegen kann, um sie bei der nächsten Anfrage beschleunigt ausgeben zu können.
2. Darüber hinaus existieren jedoch Erweiterungen, deren Ausgaben hochdynamisch sind. Zu dieser Gruppe zählen unter anderem Community-Features, deren Ausgabe minütlich wechseln kann, obwohl die Parameter gleich bleiben (oder gar keine Parameter angegeben werden). Hier würde Cache verhindern, dass der Benutzer alle neuen Informationen geliefert bekommt
Die Cache-Mechanismen werden zum an zwei verschiedenen Stellen der Extension ein- und ausgeschaltet. Dies ist zum Einen die Datei ext_localconf.php und zum anderen die Datei des Plugins selbst, die die Plugin-Base-Klasse enthält (welche in der Regel auf piX.php endet)
ext_localconf.php
t3lib_extMgm::addPItoST43($_EXTKEY,‘piX/class.tx_extensionname_piX.php’,‘_piX’,‘list_type’,1);
Der entscheidende Punkt in dieser Anweisung ist der letzte Parameter. Dieser wird im angegebenen Beispiel auf true gesetzt und das System somit angewiesen, die Ausgabe der Extension zu cachen.
t3lib_extMgm::addPItoST43($_EXTKEY,‘piX/class.tx_extensionname_piX.php’,‘_piX’,‘list_type’,0);
Im zweiten Fall wurde nun die Variable auf false gesetzt und die Ausgabe daher nicht zwischengespeichert.
class.extensionname_piX.php
Innerhalb der Extension kann nun noch festgelegt werden, ob das Plugin cHashing-Mechanismen zum Identifizieren gleicher Parameter-Kombinationen nutzen soll. cHashs werden durch den Typolink-Mechanismus erstellt, wobei die eingehenden Parametern zusammen mit dem geheimen internen Schlüssel zu einem Hash-Wert zusammengefasst werden. Dieser Mechanismus wird über das Setzen einer Klassenvariable erreicht:
var $pi_checkCHash = true;
Alternativ kann ein Plugin explizit als USER_INT Objekt ausgewiesen werden. Für diese wird in den gecachten Seiten ein Platzhalter hinterlegt, während die eigentliche Ausgabe der Extension erst zur Laufzeit der Webseite eingesetzt wird.
function main($content,$conf) {
[...]
$this->pi_USER_INT_obj = 1;
[...]
}
Ein häufig auftretender Fehler hierbei ist die Kombination der beiden letztgenannten Optionen. Allerdings widersprechen sich die beiden Konzepte, da beispielweise bei der Link-Generierung keine Cache Hashes gebildet werden, wenn ein Plugin einem USER_INT-Objekt entspricht. Um an dieser Stelle dynamische Ausgaben zu generieren, behelfen sich viele Entwickler mit der no_cache-Anweisung, die das Caching für die gesamte Seite deaktiviert. Dies bedeutet, dass die gesamte Seite von einer Indizierung ausgeschlossen wird und das Rendern der Seite erschwert wird. Von der Anweisung
$GLOBALS[‘TSFE’]->set_no_cache();
sollte in einer Live-Seite prinzipiell Abstand genommen werden.
Wie man sieht, sind die Anweisungen für Caching-Mechanismen eher übersichtlich, so dass die fachgerechte Einstellung des eigenen Frontend-Plugins keine allzu große Hürde darstellen sollte. In der Praxis gestaltet sich dies bisher leider noch zu oft als eine Hürde für Extensions mit viel Potential.