Formation PUB030 : Laravel, 2019 La façade Cache de Laravel

Utiliser le cache pour accélérer l'application Web


Une fois que le dépôt pour la façade Cache est configuré, vous pouvez commencer à l'utiliser.

Le fonctionnement est le même peu importe le dépôt utilisé sauf si vous faites appel à une fonctionnalité qui n'est pas disponible pour tous les dépôts, par exemple les étiquettes (tags).

On utilisera souvent le cache pour les opérations dans la base de données. Ce mécanisme aussi être utilisé pour mettre en cache le résultat toute autre opération qui nécessite du temps de traitement, par exemple lors d'analyse syntaxique (en anglais : parsing).

▼Publicité Le texte se poursuit plus bas

Utilisation de base

D'abord, les fichiers PHP qui utilisent le cache doivent comporter une instruction use :

Contrôleur Laravel (PHP)

use Illuminate\Support\Facades\Cache;

Informations avec date d'échéance

La logique de base pour mettre une information en cache, consiste à demander à Laravel de vérifier s'il y a déjà une information en cache pour une clé donnée.

Si oui, on retrouve sa valeur et on l'utilise sans devoir exécuter le code gourmand en ressources.

Si non, on exécute le code pour récupérer l'information puis on stocke cette valeur pour utilisation ultérieure.

La méthode longue va comme suit :

Contrôleur Laravel (PHP)

$secondes = 24 * 60 * 30;   // 30 jours

if (Cache::has('items')) {
    $items = Cache::get('items');
}
else {
    $items = Items::orderBy('code')->get();
    Cache::put('items', $items, $secondes);
}

Il est possible de simplifier cet algorithme à l'aide de la méthode remember().

Ainsi, dans cet extrait, la fonction anonyme ne sera exécutée que s'il n'existe pas d'information valide (non expirée) pour la clé.

Contrôleur Laravel (PHP)

$secondes = 24 * 60 * 30;   // 30 jours

$items = Cache::remember('items', $secondes, function () {
   return Items::orderBy('code')->get();
});

Aver ces deux techniques, l'information en cache pour cette clé sera automatiquement détruite lorsque le délai sera dépassé.

Information perpétuelle

Le même principe s'applique avec rememberForever() sauf que l'information en cache n'arrivera jamais à échéance puisqu'il n'y aura pas de date d'expiration.

Contrôleur Laravel (PHP)

$items = Cache::rememberForever('items', function () {
   return Items::orderBy('code')->get();
});

On pourra avoir le même effet avec la méthode put() si on ne précise pas de délai.

Remarquez que certains dépôts, par exemple Memcached, pourraient réinitialiser le cache de certaines informations perpétuelles si jamais ils atteignent leur limite de stockage. 

Libération d'une information en cache

Lors de la modification des informations en cache (ici : lors de l'ajout, de la modification ou de la suppression d'un item), il faudra réinitialiser le cache pour la clé en question.

Si vous ne le faites pas, les informations ne seront jamais relues dans la base de données tant que l'information en cache n'aura pas expiré.

Donc, sans le forget(), les informations mises en cache avec rememberForever() ne seront donc jamais relues dans la base de données.

Contrôleur Laravel (PHP)

Cache::forget("items");

Travail avec les étiquettes (tags)

Les étiquettes permettent de regrouper différentes clés qui pourront être réinitialisées en bloc au besoin.

Attention : elles ne sont pas disponibles si vous travaillez avec le cache de type file, dynamodb ou database.

Si vous tentez d'utiliser les étiquettes avec un dépôt qui ne les supporte pas, vous obtiendrez le message d'erreur « BadMethodCallException: This cache store does not support tagging. ».

Remarquez que dans cet exemple, la fonction anonyme a une instruction use() pour lui permettre d'utiliser une variable.

Contrôleur Laravel (PHP)

$commandesAvecItem = Cache::tags('commandes')->rememberForever("item$item->id", function() use($item) {
    return $item->commandes->ordrerBy('date');
});

Il est maintenant possible de réinitialiser toutes les clés qui correspondent à une étiquette :

Contrôleur Laravel (PHP)

// réinitialiser le cache des commandes pour touts les items
Cache::tags('commandes')->flush();

has(), get(), put()

Quand on travaille avec les étiquettes, il faut toujours faire suivre l'étiquette pour accéder à la clé.

Si on utilise Cache::has('items'), on aura toujours false.

Il faut plutôt faire ceci :

PHP

if (Cache::tags('commandes')->has("item$item->id")) {...}
...
$commandesAvecItem = Cache::tags('commandes')->get("item$item->id");
...
Cache::tags('commandes')->put("item$item->id", $commandesAvecItem, $secondes);

Réinitialiser tout le cache

La base de données a subi des changements importants? Vous pouvez à tout moment réinitialiser le cache entier en une seule commande :

Contrôleur Laravel (PHP)

Cache::flush();

Pour plus d'information

« Laravel 5: Cache – How to use it ». Jeff's Reference. http://laravel.at.jeffsbox.eu/laravel-5-cache-how-to-use-it

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Dernière révision le 2 mai 2021
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre