TYPO3 et Caching Framework : Identifier une page précisemment dans le cache (BDD ou Memcached)

De Typo3 CMS / Documentation Typo3 / Support Typo3.

Avec Typo3 il est possible pour une page d'afficher du contenu différent, selon le contexte, via des paramètres GET par exemple. Pour que chaque contenu d'une page soit en cache il faut qu'il y ait un cHash de généré.

Prenons l'exemple de l'extension tt_news. Celle-ci affiche dans une page de détail différentes news en fonction de l'uid de news passé en paramètre.

On peut donc vider le cache de la page de détail mais cette action supprimera le cache de toutes les news, ce qui sur des sites à gros volume peut causer des soucis de performance à la re-génération du cache.

Pour identifier une page précise contenant notre news, il suffit d'utiliser les tags proposés par le Caching Framework.

A partir de là il existe 2 façons de procéder le tag reg1 proposé par Typo3 ou créer ses propres tags :

Utilisation du tag reg1 géré nativement par Typo3

Par défaut la classe tslib_fe propose une variable nommé $page_cache_reg1 utilisé dans sa fonction setPageCacheContent

...
if ($this->page_cache_reg1) {
	$reg1 = intval($this->page_cache_reg1);
 
	$cacheData['reg1']     = $reg1;
	$this->pageCacheTags[] = 'reg1_' . $reg1;
}
...

Ainsi en passant un entier, l'uid de notre news, le cache de la page va être taggué avec reg1_uid. Pour ce faire il faut étendre la fonction displaySingle() de tt_news et y ajouter cette ligne :

...
if (is_array($row) && ($row['pid'] > 0 || $this->vPrev)) { // never display versions of a news record (having pid=-1) for normal website users
 
	$GLOBALS['TSFE']->page_cache_reg1 = $row['uid'];
 
...

il sera donc facile de retrouver notre page contenant la news dans le cache, si je veux supprimer le cache de cette news, il suffit de faire ceci :

if (TYPO3_UseCachingFramework) {
     $pageCache = $GLOBALS['typo3CacheManager']->getCache(
       'cache_pages'
     );
 
     $pageCache->flushByTag('reg1_'.$uid_de_la_news);
     //$pageCache->flushByTags(array('reg1_'.$uid_de_la_news));
}

Utilisation de ses propres tags

Pour ce faire tslib_fe propose une fonction addCacheTags($tags). Il suffit donc dans son plugin de taguer la page souhaitée :

$GLOBALS['TSFE']->addCacheTags(array('tx_ttnews_'.$uid_news)); 
// pour tt_news ou plus générique :
$GLOBALS['TSFE']->addCacheTags(array('tx_monplugin_'.$mavariable));

et pour vider le cache :

$pageCache->flushByTag('tx_ttnews_'.$uid_news);
//$pageCache->flushByTags(array('tx_ttnews_'.$uid_news));
// pour tt_news ou plus générique :
$pageCache->flushByTag('tx_monplugin_'.$mavariable);
//$pageCache->flushByTags(array('tx_monplugin_'.$mavariable));
Outils personnels

Formation Typo3 à Paris
Boite Oblady