Catégories
Astuces Laravel

Comment désactiver le cache de Laravel ?

Ton problème

Est ce qu’il ne t’es jamais arrivé lorsque tu développais de chercher une erreur à en devenir fou ?


Et quelques heures/jours plus tard, quand tu es prêt, avec tes yeux injecté de sang, à plonger dans la folie après avoir ingurgité un hectolitre de café dopé à la Redbull, quelqu’un te dit nonchalamment « tu as pensé à désactiver le cache de Laravel » ?

Il est intéressant, surtout en phase de développement, de pouvoir désactiver le cache plutôt que de le vider à grands coups de

php artisan cache:clear

avant chaque vérification !

En effet, à chaque fois que tu utilises dans ton application une instruction telle que celle-ci :

Cache::put('lorem', 'ipsum', 3600);

Ton application va générer des fichiers avec des répertoires et des noms bizarre dans le répertoire storage\framework\cache\data :

Les fichiers de cache générés avec le driver File

Le nom bizarre du fichier généré est en fait le nom de ta clé passé à la moulinette de la fonction sha1().

Exemple :

use Illuminate\Support\Facades\Cache;

// ...
Cache::put('lorem', 'ipsum', 3600);

Ce code va te générer le fichier ‘b5\8e\b58e92fff5246645f772bfe7a60272f356c0151a‘ avec le contenu suivant :

  • Le nom du fichier est ‘b58e92fff5246645f772bfe7a60272f356c0151a‘ qui est la correspondance exacte de sha1('lorem');
  • 1594297339s : est le timestamp d’expiration de cette variable dans le cache
  • 5‘ est la longueur de la valeur associée à la clé ‘lorem
  • en fin de notre contenu sérialisé, on retrouve notre valeur passée en paramètre à la fonction put() : ‘ipsum

La solution pour désactiver le cache de Laravel

Une fois n’est pas coutume mais la solution qui suit n’est pas documentée dans la documentation officielle.

Il existe en effet une méthode simple pour désactiver le cache en modifiant ton fichier .env et ton fichier config/cache.php.

Etape 1 – Modifier le fichier config\cache.php

Dans l’array ‘stores‘ de ton fichier de configuration cache.php, ajoute cette configuration qui va utiliser le driver null :

    'stores' => [

        // ...

        'none' => [
            'driver' => 'null',
        ],

        // ...

    ],

N’oublie pas de sauvegarder ton fichier.

Etape 2 – Modifier le fichier .env

Dans ton fichier .env, les modifications sont encore plus simples car il te suffit de changer un mot : remplace file par none pour la variable CACHE_DRIVER et le tour est joué.

// avant le changement
CACHE_DRIVER=file

// après le changement
CACHE_DRIVER=none

Pense à sauvegarder ton fichier.

A présent, après avoir effacé le cache de ta configuration et de ton application avec

php artisan config:cache
php artisan cache:clear

Si tu réutilises la fonction Cache::put('lorem', 'ipsum'); , tu verras que plus aucun fichier ne vient se placer dans le répertoire storage\framework\cache\data :

Après avoir désactiver le cache de laravel

Laravel Tips : Désactiver le cache de Laravel facilement
1. ajoute ce driver au fichier config/cache.php
‘none’ => [‘driver’ => ‘null’,],
2. dans ton fichier .env, défini CACHE_DRIVER=none

Et voilà !

Bon, désactiver le cache de Laravel => check. Tu m’expliques comment ça fonctionne ?

Ok, tu as envie de comprendre et c’est tout à ton honneur.

Alors pour saisir le fonctionnement de tout cela, on va plonger un peu dans le code source de Laravel.

Et crois moi, avec la documentation officielle, c’est le second moyen de comprendre en profondeur le fonctionnement de Laravel.

Rassure toi, on va rester en eau peu profonde !

Premier palier : le Cache Manager

Allons explorer la méthode resolve() de Illuminate\Cache\CacheManager.

protected function resolve($name)
{
  $config = $this->getConfig($name);

  if (is_null($config)) {
    throw new InvalidArgumentException("Cache store [{$name}] is not defined.");
  }

  if (isset($this->customCreators[$config['driver']])) {
    return $this->callCustomCreator($config);
  } else {
    $driverMethod = 'create'.ucfirst($config['driver']).'Driver';

    if (method_exists($this, $driverMethod)) {
        return $this->{$driverMethod}($config);
    } else {
        throw new InvalidArgumentException("Driver [{$config['driver']}] is not supported.");
    }
  }
}

Cette méthode va construire une variable $driverMethod en concaténant la string ‘create‘ avec le nom du driver retenu passé dans la fonction ucfirst() auquel sera concaténé la string ‘Driver‘.

Dans la foulée, la fonction resolve check si cette méthode existe, si c’est le cas, elle la lance avec la ligne return $this->{$driverMethod}($config);

La variable $config contient les paramètres du driver utilisé.

Alors comme dans notre fichier de config, on a passé le driver ‘null‘, resolve() va essayer de lancer une méthode qui s’appelle donc createNullDriver().

Bravo à celles et ceux qui suivent.

Et là surprise, si tu parcoure la classe CacheManager, tu découvriras la méthode CreateNullDriver :


    /**
     * Create an instance of the Null cache driver.
     *
     * @return \Illuminate\Cache\Repository
     */
    protected function createNullDriver()
    {
        return $this->repository(new NullStore);
    }

Cette méthode retourne le cache repository en lui passant une instance de la classe NullStore.

Tu constateras, avec un sourire amusé dans ton tuba, que cette classe ne fait vraiment pas grand chose :

class NullStore extends TaggableStore
{
  //..

  public function get($key)
  {
      //
  }

  public function put($key, $value, $seconds)
  {
    return false;
  }

  public function increment($key, $value = 1)
  {
    return false;
  }

  public function decrement($key, $value = 1)
  {
    return false;
  }

  public function forever($key, $value)
  {
    return false;
  }

  public function forget($key)
  {
    return true;
  }

  public function flush()
  {
    return true;
  }

  public function getPrefix()
  {
    return '';
  }
}

En fait, elle se contente de reprendre les fonctions définie par l’interface Illuminate\Contracts\Cache\Store en retournant les valeurs true et false.

Le mot de la fin

Tu peux à présent retirer ton tuba et prendre ta serviette pour te sécher. Évite de mettre du sable de partout s’il te plait :-D.

Voilà, j’espère que ce petit article t’aura aidé à comprendre le fonctionnement du cache de Laravel. Evidemment, c’est un survol rapide du fonctionnement du cache et il ne se limite évidemment pas au peu que l’on en a vu.

En tout cas, dans tes phases de développement, si tu souhaites être certain que le cache n’influence pas tes résultats ou n’est pas la source de dysfonctionnement, tu sais à présent comment désactiver le cache de Laravel.

Cet article s’est fortement inspiré de l’article de @krishankoenig disponible sur son blog.

PS : si tu préfères la vidéo à la lecture, tu peux retrouver l’équivalent de cet article en vidéo.

Abonnement unique O2Switch à 5€/mois

Par HappyToDev

Absolument passionné depuis toujours par l'informatique et la programmation, je souhaite via ce blog vous faire passer un peu du savoir que j'ai accumulé depuis des années.
Et même, pourquoi pas, vous aider à faire le premier pas dans le développement web.

Vous êtes prêts ?
Alors allons y ensemble et n'oubliez pas que les débutants sont vraiment les bienvenus.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.