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 ?

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 :

  1. _sqlquery correspond à la requête SQL que vous souhaitez exécuté.
  2. id correspond à l’identifiant lié aux données mise en cache. Pour un ID x, vous aurez un contenu x.
  3. 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.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    function execute ($sql_query, $id = null, $delay = 3600)
    {
    //On déclare une instance de cache
    $cacheDriver = new \Doctrine\Common\Cache\XcacheCache();
    $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 à null
    if ($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 cache
    if ($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 futures
    return $results;
    }

Voilà, j’espère que ce mémo vous aidera. À bientôt et merci t’avoir lu ce post !