Système de cache pour site en php5

Contenu du snippet

Bonjour,

Je poste ma première source. C'est un système de cache pour PHP5 assez performant. Je m'en sers pour la plupart de mes sites. Ayant découvert cette source en faisant des recherches sur google, je suis d'abords tomber sur une source PEAR qui de loin n'était pas assez optimiser.
J'ai un peu remanier les sources avec quelques améliorations :
-Utilisation de différents sous-dossiers paramétrables (Un pour le sql, config...)
-Utilisation du md5

Le nom des fonctions sont en français, à la fois car je la fournis à des copains afin de leur montrer que les noms des variables sont importants mais aussi car j'ai toujours codé en français même si cela comporte beaucoup de désavantages.

Source / Exemple :


<?php
/*

    • +---------------------------------------------------------------------------------+
    • | Nom du fichier : Cache.php
    • | Date de création : 22/04/2008
    • | Dernière modification : 22/04/2008
    • | Créateur : Petit bateau
    • +---------------------------------------------------------------------------------+
  • /
/* class Cache { // Dossier de stockage du cache protected static $dossier = 'cache/'; // Préfixe des fichiers lors de l'écriture protected static $prefixe = 'cache_'; // Activation du cache const CACHE = TRUE; /**
  • Ecrire les données
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • @param int $duree Durée du cache (en secondes)
  • /
protected static function ecrire($groupe, $id, $duree, $donnee) { $nomFichier = self::nomFichier($groupe, $id); if ($fp = fopen($nomFichier, 'xb')) { if (flock($fp, LOCK_EX)) { fwrite($fp, $donnee); } fclose($fp); touch($nomFichier, time() + $duree); } } /**
  • Lire les données
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • /
protected static function lire($groupe, $id) { $nomFichier = self::nomFichier($groupe, $id); return file_get_contents($nomFichier); } /**
  • Déterminer si une entrée est en cache
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • /
protected static function enCache($groupe, $id) { $nomFichier = self::nomFichier($groupe, $id); if(CACHE && file_exists($nomFichier) && filemtime($nomFichier) > time()) { return TRUE; } else if(CACHE && !file_exists($nomFichier)) { return FALSE; } @unlink($nomFichier); return FALSE; } /**
  • Construit le chemin d'accès et à partir du nom du groupe et de l'id
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • /
protected static function nomFichier($groupe, $id) { $id = md5($id); if(!is_dir(self::$dossier . $groupe)) { mkdir (self::$dossier . $groupe, 0777); } return self::$dossier . $groupe . '/' . self::$prefixe . "{$groupe}_{$id}"; } /**
  • Retourne le préfixe de nom de fichier à utiliser
  • @param string $prefixe Préfixe du nom de fichier à utiliser
  • /
public static function Prefixe($prefixe) { self::$prefixe = $prefixe; } /**
  • Définit le cache pour stocker des fichiers (Défaut : ./cache/).
  • Doit avoir slash final.
  • @param string $dossier Le répertoire pour stocker les données en cache
  • /
public static function urlStockage($dossier) { self::$dossier = $dossier; } } // Extension pour enregistrer des données class DonneeCache extends Cache { /**
  • Récupère les données de la mémoire cache
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • @return mixed Soit les données qui en résultent, ou null
  • /
public static function obtenirDonnee($groupe, $id) { if(parent::enCache($groupe, $id)) { return unserialize(parent::lire($groupe, $id)); } return NULL; } /**
  • Enregistre les données dans le cache
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • @param int $duree Durée du cache (en secondes)
  • @param mixed $donnee Les données à stocker
  • /
public static function ecrireDonnee($groupe, $id, $duree, $donnee) { parent::ecrire($groupe, $id, $duree, serialize($donnee)); } } // Extension pour enregistrer des sorties de script (templates...) class SortieCache extends Cache { // Groupe de stockage private static $groupe; // Id unique de stockage private static $id; // Durée du cache (en secondes) private static $duree; /**
  • Commence l'enregistrement des données dans le cache
  • @param string $groupe Groupe sous lequel les données ont été stockées
  • @param string $id ID unique de ces données
  • @param int $duree Durée du cache (en secondes)
  • /
public static function Debut($groupe, $id, $duree) { if (parent::enCache($groupe, $id)) { echo parent::lire($groupe, $id); return true; } else { ob_start(); self::$groupe = $groupe; self::$id = $id; self::$duree = $duree; return false; } } /**
  • Fini l'enregistrement des données dans le cache
  • /
public static function Fin() { $donnee = ob_get_contents(); ob_end_flush(); parent::ecrire(self::$groupe, self::$id, self::$duree, $donnee); } } ?>

Conclusion :


Pour s'en servir c'est très simple :

-pour les données

if (!$resultat = DonneeCache::obtenirDonnee('Groupe', 'IdUnique'))
{
$resultat = mysql_query('SELECT BIG_ASS_QUERY()');

DonneeCache::ecrireDonnee('Groupe', 'IdUnique', 3600, $resultat);
}

// Utilisation de la variable $resultat

-Pour les sorties de script

if (!SortieCache::Debut('Groupe', 'IdUnique', 3600))
{

// Code à mettre en cache générer par vos scripts

SortieCache::Fin();
}

Voilà, bonne journée

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.