Aller au contenu

MCache

Présentation

MCache est une classe PHP simple et légère qui permet de mettre en cache des variables ou des objets dans des fichiers. Elle est particulièrement utile pour stocker des résultats de calculs coûteux ou des données fréquemment utilisées qui ne changent pas souvent.

Fonctionnalités

  • Stockage de n'importe quelle variable sérialisable (tableaux, objets, etc.)
  • Gestion de l'expiration des données en cache
  • Interface simple avec seulement trois méthodes principales
  • Désactivation globale du cache si nécessaire

Utilisation de base

Initialisation

use mlib\utils\cache\MCache;

// Créer une instance de MCache avec un répertoire de cache
$cache = new MCache('/chemin/vers/le/cache/');

Stocker une valeur en cache

// Stocker une valeur simple
$cache->set('ma_cle', 'ma_valeur');

// Stocker un tableau
$donnees = ['nom' => 'Dupont', 'prenom' => 'Jean'];
$cache->set('utilisateur_123', $donnees);

// Stocker un objet
$objet = new MaClasse();
$cache->set('mon_objet', $objet);

Récupérer une valeur en cache

// Récupérer une valeur sans expiration
$valeur = $cache->get('ma_cle');

// Récupérer une valeur avec une expiration de 1 heure (3600 secondes)
$donnees = $cache->get('utilisateur_123', 3600);

// Vérifier si le cache existe
if ($donnees === false) {
    // Le cache a expiré ou n'existe pas
    $donnees = // ... calcul ou récupération coûteuse ...
    $cache->set('utilisateur_123', $donnees);
}

Supprimer une entrée du cache

$cache->delete('ma_cle');

Gestion avancée

Désactiver le cache globalement

Il est possible de désactiver complètement le cache pour toutes les instances de MCache :

// Désactiver le cache globalement
MCache::disable();

// Tous les appels suivants à set() seront ignorés
// Tous les appels à get() retourneront false
$cache = new MCache('/chemin/vers/le/cache/');
$cache->set('test', 'valeur'); // Ne fera rien
$valeur = $cache->get('test'); // Retournera false

Cela peut être utile pour désactiver temporairement le cache pendant des phases de développement, ou pendant la maintenance.

Gestion des fichiers de cache

Les fichiers de cache sont stockés dans le répertoire spécifié lors de l'instanciation de la classe. Chaque entrée est stockée dans un fichier séparé avec l'extension .cache.

Exemple de structure de fichiers :

/cache/
    utilisateur_123.cache
    mon_objet.cache
    ma_cle.cache

Bonnes pratiques

  1. Choix des clés : Utilisez des clés descriptives et uniques pour éviter les collisions.

  2. Gestion des erreurs : Toujours vérifier la valeur de retour de get() qui peut être false si le cache n'existe pas ou a expiré.

  3. Expiration : Utilisez des durées d'expiration appropriées en fonction de la fréquence de mise à jour de vos données.

  4. Nettoyage : Mettez en place un mécanisme de nettoyage des anciens fichiers de cache si nécessaire.

  5. Sécurité : Assurez-vous que le répertoire de cache n'est pas accessible directement depuis le web.

Exemple complet

use mlib\utils\cache\MCache;

class MonService {
    private $cache;

    public function __construct() {
        $this->cache = new MCache(__DIR__ . '/../cache/');
    }

    public function getDonneesUtilisateur($userId) {
        $cacheKey = 'utilisateur_' . $userId;

        // Essayer de récupérer les données depuis le cache (valides 1h)
        $donnees = $this->cache->get($cacheKey, 3600);

        if ($donnees === false) {
            // Les données ne sont pas en cache ou ont expiré
            $donnees = $this->recupererDonneesDepuisLaBase($userId);

            // Mettre en cache pour la prochaine fois
            $this->cache->set($cacheKey, $donnees);
        }

        return $donnees;
    }

    public function mettreAJourDonneesUtilisateur($userId, $nouvellesDonnees) {
        // Mettre à jour la base de données
        $this->mettreAJourBaseDeDonnees($userId, $nouvellesDonnees);

        // Invalider le cache
        $cacheKey = 'utilisateur_' . $userId;
        $this->cache->delete($cacheKey);
    }

    private function recupererDonneesDepuisLaBase($userId) {
        // Simulation d'un appel coûteux à la base de données
        sleep(2);
        return [
            'id' => $userId,
            'nom' => 'Dupont',
            'prenom' => 'Jean',
            'email' => 'jean.dupont@exemple.com',
            'derniere_connexion' => date('Y-m-d H:i:s')
        ];
    }

    private function mettreAJourBaseDeDonnees($userId, $donnees) {
        // Logique de mise à jour de la base de données
        // ...
    }
}

// Utilisation
$service = new MonService();

// Première lecture - lent (met en cache)
$donnees1 = $service->getDonneesUtilisateur(123);

// Deuxième lecture - rapide (depuis le cache)
$donnees2 = $service->getDonneesUtilisateur(123);

// Mise à jour des données
$service->mettreAJourDonneesUtilisateur(123, ['email' => 'nouvel.email@exemple.com']);

// Prochaine lecture - lent car le cache a été invalidé
$donnees3 = $service->getDonneesUtilisateur(123);