Améliorer le warmup du cache de Symfony2

Lorsque vous vous lancez sur un développement sous Symfony2 en venant d’un monde sans framework (oui, je sais, cela peut surprendre mais il existe encore quelques peuplades reculées qui résistent encore et toujours à l’envahisseur), un des challenges à surmonter est la gestion du cache du framework lors du déploiement d’une application. Si en plus cette application est utilisée par des milliers d’internautes en Europe, le moindre à-coup dans les performances peut être difficile à vivre par votre plate-forme.

Cache warmup

Une chose à ne pas oublier quand vous déployez une nouvelle version de votre application est de « préchauffer » (warm-up) le cache du framework.

Eh oui, un peu comme les moteurs diesel des années 80 !

Par contre, si le framework monte déjà beaucoup de choses, il manque une petite chose qui peut vous permettre de ne pas avoir des temps de réponses moisis au moment de la bascule : la chauffe du fichier classes.php

A quoi sert ce classes.php  ?

Afin d’éviter de passer son temps à faire appel à l’autoload pour toutes les classes qui servent souvent, le framework génère un fichier contenant un certain nombre de classes, le charge en une fois au boot du kernel.

Cependant, ce fichier met un certain temps à être généré par les premières requêtes qui arrivent sur votre pauvre application sans défense tout juste sortie de son nid. Et comme les internautes voraces veulent tous en même temps des réponses à leurs requêtes, les premiers arrivés se retrouvent tous à calculer cet unique fichier.

Heureusement il y a les CacheWarmer (warmeeeeeeeer !)

Symfony2, dans son infinie sagesse, offre la possibilité au développeur avisé d’ajouter des bouts  de code permettant de chauffer le cache pour ses besoins spécifiques.

Comment ? En ajoutant à vos bundles une classe implémentant l’interface CacheWarmerInterface, en la déclarant comme service dans l’injection de dépendance et en le tagguant (gentiment  !) comme kernel.cache_warmer.

Et comme je suis gentil, le warmer de classes.php, je vous l’offre ! Le code de ce bundle est sur Github bien sûr et il est disponible sur packagist évidemment.

1. Ajouter le à votre composer.json

{
    "require" : {
        "zibok/class-cache-warmer": "dev-master"
    }
}

2. Ajouter le bundle dans votre AppKernel

new Zibok\Bundle\ClassCacheWarmerBundle\ZibokClassCacheWarmerBundle();

Et le tour est joué : vider votre cache et vérifier que dans le nouveau répertoire vous avez bien le classes.php.

Conclusion

Au delà de l’aspect (un peu) pratique de ce bundle, il est également un exemple très simple de cache warmer que je vous invite à lire si vous êtes novice pour vous rendre compte à quel point il est facile de venir se greffer à la gestion/génération du cache de Symfony2.