Zend Framework : Utilisation des tags dans Zend_Cache
Il y a un petit truc assez sympa avec la gestion des caches dans Zend Framework (et donc Zend_Cache) et c'est les tags.
Les tags sont peut-être ignorés par beaucoup parce que ce n'est que le 3ème paramètre et qu'il n'est pas obligatoire. Voici un petit exemple de leur utilité.
Nous sommes d'accord que lorsqu'on crée un cache lors de la lecture, il va falloir supprimer ce cache si l'information change. Autrement, la dite information sera rechargée du cache et donc pas à jour.
Dans l'exemple ci-dessous, je charge une liste de produits que je mets en cache :
$cache = Zend_Registry::get('cache') ;
$cache_id = 'product_list' ;
$products = $cache->load($cache_id) ;
if (!$products) {
// ... chargement depuis la base de données ...
$cache->save($products, $cache_id, array('product')) ;
}
Comme on peut le voir, j'ai "tagué" le cache avec le terme product. Zend_Cache sait donc maintenant que ce cache fait partie de la famille ou catégorie des caches product.
Je peux imaginer maintenant, charger une deuxième liste de produits ou un résultat de recherche contenant des produits également, et taguer à nouveau ce cache dans cette même famille.
Plus tard, dans mon backoffice, je vais mettre à jour un produit et à la fin de ma mise à jour, je vais nettoyer mes caches.
$cache = Zend_Registry::get('cache') ;
$cache->clean(Zend_Cache::CLEANING_MODE_ALL, array('product')) ;
Eh oui, c'est déjà fait. Grâce à la méthod clean, j'ai effacé tous les caches de la famille product, en une seule et unique ligne.
Facile ! 





Fil des commentaires de ce billet
Commentaires
Effectivement !! Je ne connaissais pas du tout mais maintenant
:p 
Salut,
Juste une petite précision, sauf erreur de ma part les tags ne fonctionnent qu'avec les caches utilisant les fichiers.
ça ne fonctionne pas si le cache usilise APC par exemple.
Une raison qui m'a poussé a utiliser les fichiers et non APC d'ailleurs
@++ Kaimite
Ici tu utilises "CLEANING_MODE_ALL" donc ca n'efface pas que les caches "product" mais tous tes caches! Tu devrais utiliser "CLEANING_MODE_MATCHING_TAG"
[je passais par là car j ai moi-meme un soucis avec les tags... j arrive a cleaner "ALL" mais pas "CLEANING_MODE_MATCHING_TAG" ... ]