Aktuelle Informationen rund um TYPO3

Archiv des Monats Mai, 2008

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

  1. 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.

  1. 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:

  1. 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.

  1. function main($content,$conf) {
  2.     [...]
  3.     $this->pi_USER_INT_obj = 1;
  4.     [...]
  5.   }

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

  1. $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.

CObject im Backend

Wer häufiger mal Module für das TYPO3-Backend entwickelt, hat sich sicherlich auch schonmal daran gestoßen, dass es im Backend keinen Zugriff auf das cObject gibt, wie man es beispielsweise aus dem Frontend kennt.

  1. $this->cObj->HMENU($this->conf[‘menu’]);

Im Folgendem beschreibe ich kurz, wie man ein Objekt der Klasse tslib_cObj im Backend erstellt.

weiterlesen »

Browserweichen mit Prototype 2

Zu meinem letzten Beitrag zu dem Thema “Browserweichen in JavaScript” gab es die Bemerkung, dass es in Mootools einfacher ist, entsprechende Weichen zu verwenden. Das ist richtig, denn dort gibt es die aufgezeigten Funktionalitäten von Hause aus und bereits in der offiziellen Doku dokumentiert. Aber wer schon mehrere Zeilen Code bzw. ein ganzes Projekt in Prototype umgesetzt hat, wird kaum wechseln wollen. Allerdings gefällt mir die Implementierung in Mootools besser. Letztes Wochenende habe ich mich daran gemacht, diese Implementierung in die Prototype-Bibliotek zu übernehmen.

weiterlesen »

JS-Error in IE, Totalabbruch

Letzte Woche habe ich versucht, einen JavaScript-Fehler zu beheben, der im IE auf einer Seite auftrat, die wir vor längerer Zeit mit recht vielen JavaScript-Elementen ausgestattet hatten. Auf der ersten Seite findet sich dort ein Flashelement, die aus unerklärlichen Gründen im IE nicht mehr funktionierte. Dieses Flash wird mittels JavaScript eingebunden (mittels des coolen SWFObject).

Zu meiner noch viel größeren Überraschung kam aber noch hinzu, dass die Seite manchmal funktionierte. Nach ein paar Tests nämlich genau dann, wenn der Cache leer war. Dann kam keine Fehlermeldung und die Seite wurde korrekt und fehlerfrei angezeigt. Und auch wenn die Fehlermeldung kam, konnte man bei genauem Hinsehen vorher die teilweise gerenderte Seite kurz aufblitzen sehen. Mit völligem Unverständnis, wie es zu dieser Fehlermeldung kommen kann, habe ich mich auf die Suche nach einer Lösung gemacht.

weiterlesen »

Browserweichen mit Prototype

Es gibt ein undokumentiertes Objekt in Prototype, welches einem beim schreiben von JavaScript-Browserweichen sehr behilflich sein kann. Dieses Objekt ist in der Prototype-API nicht dokumentiert, da ja Crossbrowser-Probleme üblicherweise von Prototype übernommen werden sollen und deswegen dieses Objekt überflüssig sein sollte. Jedoch wird es intern in der Prototype.js verwendet.

An den meisten Stellen sollte es in der Tat überflüssig sein, jedoch fand ich mich schon manchmal in einer Situation, wo ich diese Funktionalitäten doch brauchte. Im folgenden möchte ich auf die Verwendung kurz eingehen.

weiterlesen »