Invalider du cache Symfony sur plusieurs serveurs avec SonataCacheBundle (French)

2014-06-10

  symfony    french    cache 

Lorsque l'on travaille sur de gros projets à fort trafic ou alors que, dans mon cas, l'on travaille sur des sites multilingues, il est parfois nécessaire d'invalider tout ou partie du cache Symfony.

J'ai récemment travaillé sur une pull request sur SonataCacheBundle afin d'y apporter un adapter Symfony et offrir cette possibilité d'invalider du cache applicatif Symfony.

Dans mon cas, le besoin était de rafraichir le cache des traductions Symfony après chaque modification, par le client, dans le back office.

Il fallait donc que je supprime le répertoire "app/cache//translations" et ceci se fait désormais très simplement avec SonataCacheBundle.

Installation

Commencez par ajouter la dépendance dans votre fichier composer.json :


"sonata-project/cache-bundle": "dev-master"

puis lancez l'installation de la dépendance :


$ composer install
Configuration

Après avoir enregistré le bundle dans votre fichier app/AppKernel.php, ajoutez la configuration suivante dans votre fichier app/config/config.yml :


sonata_cache:
    caches:
        symfony:
            token: s3cur3 # token used to clear the related cache
            php_cache_enabled: true # Optional (default: false), clear APC or PHP OPcache
            types: [translations] # Optional, you can restrict allowed cache types
            servers:
                - { domain: kooqit.front1.local, ip: 127.0.0.1, port: 80}
                - { domain: kooqit.front2.local, ip: 127.0.0.1, port: 80}

Comme vous pouvez le voir, vous devez ici définir un token de sécurité qui sera envoyé par votre applicatif afin que n'importe qui ne puisse pas invalider votre cache.

Un paramètre de configuration nommé php_cache_enabled peut également être activé afin d'invalider le cache APC ou PHP OPcache (en fonction de votre version de PHP) après avoir invalidé votre cache Symfony.

Le paramètre types définit un tableau sur les sous-répertoires du répertoire app/cache/environnement que vous pourrez invalider en utilisant SonataCacheBundle. Ceci permet également de restreindre les types de caches pouvant être invalidés.

Enfin, vous n'avez plus qu'à définir votre liste de servers ainsi que le nom de domaine utilisé pour votre application. SonataCacheBundle va en fait établir une connexion en socket et faire une requête HTTP (avec le token fourni) sur votre application.

Utilisation

Bien, tout est prêt, il ne vous reste plus qu'à appeler la méthode d'invalidation du cache dans votre controller ou votre service dédié. Pour se faire, vous pouvez simplement injecter le service sonata.cache.symfony.

Ensuite, pour invalider tout le cache :


$this->get('sonata.cache.symfony')->flushAll();

Ou, pour invalider uniquement le cache des traductions :


$this->get('sonata.cache.symfony')->flush(array('translations'));

Et voilà, le tour est joué, en 1 ligne, vous pouvez invalider le cache de votre application Symfony déployée sur plusieurs serveurs.

Comments