Système de cache pour site en php5

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 551 fois - Téléchargée 17 fois

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

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
lundi 28 mai 2007
Statut
Membre
Dernière intervention
24 avril 2008

Salut,

Effectivement, merci je corrige :-)
Messages postés
2
Date d'inscription
jeudi 26 juin 2003
Statut
Membre
Dernière intervention
23 avril 2008

Salut,

y'a une erreur ligne 191, il doit manquer un e à group dans cette partie du code ?

self::$group = $groupe;
Messages postés
5
Date d'inscription
lundi 28 mai 2007
Statut
Membre
Dernière intervention
24 avril 2008

Ben moi je trouves que sa reviens au même de toute façon, puisque dans tout les cas si les données sont corrompus ou inexistantes, elles sont remplacés.
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

tu as :
# public static function obtenirDonnee($groupe, $id)
# {
# if(parent::enCache($groupe, $id)) // Pour moi, ceci n'est pas possible a faire
# {
# return unserialize(parent::lire($groupe, $id));
# }
#
# return NULL;
# }

lorsque tu utilises ta classe, je pense que tu devrais plutot verifier la présence du cache avant d'obtenir les données et non pas lorsque tu récuperes les données, c'est ce que je voulais te dire. et ce que j'ai noté dans le code en fin de commentaire
Messages postés
5
Date d'inscription
lundi 28 mai 2007
Statut
Membre
Dernière intervention
24 avril 2008

Re,
Je n'ai pas compris quand tu me dis :
"obtenirDonnee ne doit jamais vérifier la présence du cache, tu dois le faire en amont"
La verification du fichier se fait bien en amont grâce à "enCache"

Sinon j'ai mal compris
Afficher les 7 commentaires

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.