29 - La gestion du cache avec Symfony

Catégories : Symfony

Mots-clés : Symfony cache optimisation

113 lectures

Auteur : user Benoit

Date :

Lors de la création d'un projet Symfony, il peut être nécessaire d'améliorer les performances de certaines pages en mettant leur contenu en cache.

Pour bien voir les évolutions de performances, on utilisera les informations présentes dans la barre de "debug" (Profiler) en mode développeur.

Dans les informations utiles figurent le temps de chargement, le nombre d'appels au cache et le nombre de requêtes en base de données.

Lorsque vous identifiez une fonction ou un traitement qui prend du temps mais qui renvoie des informations “statiques” et qui ne changent pas tout le temps, vous pourrez l'intégrer dans un appel au cache.

Nous prenons pour exemple un appel à Doctrine pour aller chercher une annonce dans la base de données.

Dans AnnoncesController, nous avons la méthode details qui contient la ligne de code suivante

$annonce = $annoncesRepo->findOneBy(['slug' => $slug]);

Cette ligne fait un appel à la base de données pour récupérer une annonce.

Les annonces ne changeant pas souvent, il peut être intéressant de mettre ces informations en cache pour ne pas interroger la base à chaque fois.

Nous injecterons donc l'interface CacheInterface dans notre méthode en modifiant son appel comme ceci

public function details($slug, AnnoncesRepository $annoncesRepo, Request $request, SendMailService $mail, CacheInterface $cache)

Nous pourrons donc utiliser $cache dans notre code pour manipuler le cache.

2 méthodes sont proposées par cette interface :

  • get : tente d'appeler un élément du cache et le crée s'il n'existe pas
  • delete : supprime une entrée du cache

Pour mettre l'annonce dans le cache, nous utiliserons donc la méthode get. Cette méthode prend divers paramètres. Le 1er est un nom unique pour retrouver l'entrée du cache, le 2ème est une fonction callback qui renvoie les données à stocker en cache.

$annonce = $cache->get('annonce_details_'.$slug, function() use($annoncesRepo, $slug){
	return $annoncesRepo->findOneBy(['slug' => $slug]);
});

Vous remarquerez la concaténation de $slug pour rendre le nom unique ainsi que l'injection des variables nécessaires au moyen de use.

Il est également possible de manipuler l'élément mis en cache et de lui ajouter, par exemple, une durée avant expiration comme ci-dessous, avec une validité d'une heure (3600 secondes).

$annonce = $cache->get('annonce_details_'.$slug, function(ItemInterface $item) use($annoncesRepo, $slug){
	$item->expiresAfter(3600);
	return $annoncesRepo->findOneBy(['slug' => $slug]);
});

Et voilà.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat