Das Caching Framework stammt zu grossen Teil von FLOW3 und dient dazu, TYPO3 Seiten zu beschleunigen. Anders als das alte Cachingsystem, welches nur die TYPO3 eigenen Tabellen benutzt, bietet das Caching Framework viele verschiedene Möglichkeiten, Caches zu speichern. Zum Beispiel im Arbeitsspeicher oder auf einem externen Server.
Schon seit TYPO3 4.3 wird das Caching Framework neben dem alten Core Cache mitgeliefert, ab Version 4.6 ist es jedoch standarmässig aktiviert.
In diesem Beitrag geht es vor allem um die Verwendung des Caching Frameworks in eigenen Extensions.
Caching Framework aktivieren
Um das Caching Framework in einer niedrigeren Version als 4.6 zu aktivieren muss im localconf.php folgende Zeile eingetragen werden:
1 |
$TYPO3_CONF_VARS['SYS']['useCachingFramework'] = true; |
Diese Einstellung ist nicht notwendig, wenn das Caching Framework nur für eigene Extensions benutzt wird. Ist sie jedoch nicht gesetzt, werden der Cache Manager und die Cache Factory nicht initialisiert und dies muss mit
1 |
t3lib_cache::initializeCachingFramework() |
selbst vorgenommen werden.
Garbage Collection
Um Cache Einträge, dessen Lebensdauer abgelaufen ist zu entfernen gibt es ab TYPO3 4.5 einen Garbage Collection Task. Um Speicherplatz zu sparen, sollte dieser im Scheduler Modul aktiviert werden.
Caching Tabellen
Extensions die mit TYPO3 4.3 bis 4.5 funktionieren sollen und das Datenbank Backend des Caching Framework benutzen, benötigen eigene Tabellen für Cache und Cache Tags.
Diese werden im ext_tables.sql hinzugefügt.
1 2 3 4 5 6 7 8 9 10 11 12 |
# # TABLE STRUCTURE FOR TABLE 'tx_myext_mycache' # CREATE TABLE tx_myext_mycache ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, identifier VARCHAR(250) DEFAULT '' NOT NULL, crdate INT(11) UNSIGNED DEFAULT '0' NOT NULL, content mediumblob, lifetime INT(11) UNSIGNED DEFAULT '0' NOT NULL, PRIMARY KEY (id), KEY cache_id (identifier) ) ENGINE=InnoDB; |
1 2 3 4 5 6 7 8 9 10 11 |
# # TABLE STRUCTURE FOR TABLE 'tx_myext_mycache_tags' # CREATE TABLE tx_myext_mycache_tags ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, identifier VARCHAR(250) DEFAULT '' NOT NULL, tag VARCHAR(250) DEFAULT '' NOT NULL, PRIMARY KEY (id), KEY cache_id (identifier), KEY cache_tag (tag) ) ENGINE=InnoDB; |
Cache Registrieren
Damit eigene Caches benutzt werden können, müssen sie registriert werden. Dazu wird ab TYPO3 4.6 einfach im ext_localconf.php ein Subarray von cacheConfigurations angelegt.
1 2 3 |
if (!is_array($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache'] = array(); } |
Nach der Registrierung können auch weitere Einstellungen für den Extension Cache vorgenommen werden. Es kann zum Beispiel ein spezifisches Cache Backend oder Frontend ausgewählt werden.
1 2 3 |
if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations]['myext_mycache']['backend'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['backend'] = 't3lib_cache_backend_TransientMemoryBackend'; } |
Für Versionen vor 4.6 müssen noch weitere Einstellungen vorgenommen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['frontend'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['frontend'] = 't3lib_cache_frontend_StringFrontend'; } if (t3lib_utility_VersionNumber::convertVersionNumberToInteger(TYPO3_version) < '4006000') { // Als Backend wird Datenbank ausgewählt, welches ab 4.6 Default ist. if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['backend'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['backend'] = 't3lib_cache_backend_DbBackend'; } // Die eigenen Cache Tabellen müssen angegeben werden. Ab 4.6 nicht mehr nötig. if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options'] = array(); } if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options']['cacheTable'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options']['cacheTable'] = 'tx_myext_mycache'; } if (!isset($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options']['tagsTable'])) { $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['myext_mycache']['options']['tagsTable'] = 'tx_myext_mycache_tags'; } } |
Cache Initialisieren
Um den eigenen Cache nun schliesslich verwenden zu können, muss er initialisiert werden. In TYPO3 4.6 bekommt man mit
1 |
$GLOBALS['typo3CacheManager']->getCache('myext_mycache') |
eine Instanz des Caches.
Für tiefere Versionen muss wie schon erwähnt zuerst
1 |
t3lib_cache::initializeCachingFramework() |
aufgerufen werden und falls die getCache Funktion einen „No Such Cache“ – Error wirft, kann die Cache Instanz wie folgt erzeugt werden:
1 2 3 4 5 6 |
$GLOBALS['typo3CacheFactory']->create( 'myext_mycache', $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] ['myext_mycache']['frontend'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] ['myext_mycache']['backend'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] ['myext_mycache']['options'] ); |
Funktionen
Der eigene Cache kann nun benutzt werden und bietet folgende Funktionen:
- has($identifier) – Überprüft, ob ein Eintrag mit dem übergebenen Identifier vorhanden ist.
- get($identifier) – Gibt den gewünschten Eintrag oder NULL, falls kein Eintrag vorhanden ist, zurück.
- getByTag($tag) – Gibt alle Einträge mit dem übergebenen Tag zurück.
- remove($identifier) – Entfernt den gewünschten Cache Eintrag.
- flush() – Entfernt alle Cache Einträge.
- flushByTag($tag) – Entfernt alle Einträge mit dem übergebenen Tag.
- set($identifier, $data, $tags = array(), $lifetime = NULL) – Schreibt einen Eintrag in den Cache. Lifetime wird in Sekunden angegeben. Bei NULL wird der default genommen, 0 heisst unendlich.
- collectGarbage() – Startet den Garbage Collector.
- getBackend() – Gibt das Cache Backend des aktuellen Caches zurück.
- getIdentifier() – Gibt den Identifier dieses Caches zurück.
- isValidEntryIdentifier($identifier) – Überprüft, ob ein Identifier Gültig ist und gibt true, beziehungsweise false zurück.
- isValidTag($tag) – Überprüft, ob ein Tag valid ist und gibt true oder false zurück.
Codebeispiele von typo3.org.
Pingback: Caching Framework: automatisch Cache leeren bei Datensatzänderung « wissen.netzhaut.de