Symfony2 : Gérer soit-même le cache
Le cache est présent partout dans l’informatique et heureusement d’ailleurs. Sans lui, les temps de traitement serai bien plus long ! À l’heure où tous les Framework digne de ce nom font appel à système de cache, pourquoi aurait-on besoin de gérer nous-même le cache ?
Sommaire
Le cache dans Symfony2
Dans Symfony2, on peut facilement mettre en place un système de cache. D’ailleurs si on voulait être exact, on dirait que Symfony possède propre système cache (app/cache/env/), et que l’on peut en plus plugger un système de cache au niveau du serveur (Apache, IIS, …). Ce cache est entièrement gérable et la mémoire est volatile. Dès lors que le serveur est redémarré le cache du serveur est supprimé.
Les systèmes de cache
Quels sont les systèmes de cache qui existent ? De mémoire, trois programmes reviennent régulièrement.
- XCache
- Memcached
- APC
APC est désormais deprecated depuis PHP 5.4, je ne vous recommande donc pas d’essayer de le plugger.
Dans mon cas, je vais utiliser XCache. Vous pouvez d’ailleurs retrouver mon post sur comment installer XCache.
Pourquoi gérer son cache soit-même
Je vois bien quelques commentaires arrivées et demander « pourquoi ? ». Alors que Doctrine vous permet d’utiliser facilement le cache via sa méthode useResultCache(use, delay, id). Ma réponse est simple : pour faire des traitements libres.
Un petit exemple pour vous donner quelques idées. Admettons que je mette en cache un élément d’une base de donnée. Si je modifie cette entité, le cache ne sera mis à jour que lorsque les données auront expirées. Avec une gestion du cache personnalisée, je pourrai avant même que le cache atteigne le délai impartie re-setter les nouvelles données et venir écraser les anciennes. Cela demande une gestion importante mais les gains de performances peuvent être conséquent.
Symfony2 et comment gérer soit-même son cache
Je vous propose ce petit mémo code permettant de gérer aisément. Dans notre cas, la fonction de ce Gist a pour objectif de renvoyer le résultat d’une requête SQL.
Prototype : function execute ($sql_query, $id = null, $delay = 3600);
Paramètres :
- _sqlquery correspond à la requête SQL que vous souhaitez exécuté.
- id correspond à l’identifiant lié aux données mise en cache. Pour un ID x, vous aurez un contenu x.
- delay correspond au temps maximum où vous donnez cache seront valide. Par défaut, 3600 secondes. Cela signifie qu’après avoir mis vos données en cache, elles seront disponible pendant 3600 secondes.
12345678910111213141516171819202122232425262728function execute ($sql_query, $id = null, $delay = 3600){//On déclare une instance de cache$cacheDriver = new DoctrineCommonCacheXcacheCache();$results = null;//Si un ID a été saisie et que le système de cache contient des données pour un ID "x"if ($id != null && $cacheDriver->contains($id)) {//Alors on prend les données en cache pour un ID "x"$results = $cacheDriver->fetch($id);}//Si on n'a pas de donnée, dans le cas ou la donnée mise en cache soit égale à nullif ($results == null) {//On récupère les données$results = $this->container->get("doctrine")->getManager()->getRepository("NamespaceNameBundle:Entity")->findAll();//Si on a un ID de mise en cacheif ($id != null) {//On sauvegarde les données pour un ID x et pour un délai y$cacheDriver->save($id, $results, intval($delay));}}//On retourne les résultats en limitant les requêtes futuresreturn $results;}
Voilà, j’espère que ce mémo vous aidera. À bientôt et merci t’avoir lu ce post !