Accueil > > > SYSTÈME DE CACHE POUR SITE EN PHP5
SYSTÈME DE CACHE POUR SITE EN PHP5
Information sur la source
Description
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
- <?php
- /*
- ** +---------------------------------------------------------------------------------+
- ** | Nom du fichier : Cache.php
- ** | Date de création : 22/04/2008
- ** | Dernière modification : 22/04/2008
- ** | Créateur : Petit bateau
- ** +---------------------------------------------------------------------------------+
- */
-
- /*
- ** Implémentation d'un système de cache pour les sites
- ** Inspiration de Caching Libraries for PHP5 http://www.phpguru.org/static/Caching.html
- ** © Copyright 2005 Richard Heyes
- */
-
- 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);
- }
- }
-
- ?>
<?php
/*
** +---------------------------------------------------------------------------------+
** | Nom du fichier : Cache.php
** | Date de création : 22/04/2008
** | Dernière modification : 22/04/2008
** | Créateur : Petit bateau
** +---------------------------------------------------------------------------------+
*/
/*
** Implémentation d'un système de cache pour les sites
** Inspiration de Caching Libraries for PHP5 http://www.phpguru.org/static/Caching.html
** © Copyright 2005 Richard Heyes
*/
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
Historique
- 22 avril 2008 19:19:18 :
- MAJ des constantes (Oubli de ma part)
- 22 avril 2008 19:22:46 :
- Oubli d'un point virgule
- 24 avril 2008 11:12:52 :
- Oubli d'un "e" à groupe
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
cache du navigateur [ par booth ]
c'est encore moa....Désolé mais j'ai un projet à terminer dans peu de temps alors...J'ai pas trouvé le moyen de forcer le navigateur (et le proxy pend
problême de cache [ par sana72 ]
bonjour,Pour annuler la mise en cache de mes pages, j'utilise :<? header("Pragma: no-cache"); header("Expires: 0"); header("Last-Modified: "
class,PDF,XLS et boucles..... [ par booth ]
bonjour!j'ai un méga problème...je dois générer un PDF et une grillle excel toutes deux issues d'un moteur de recherche...pour le moteur de recherche
balise, cache :( [ par elanspeech ]
Bonjour,J'utilise la balise suivante :<embed src="fichier.wav" width=145 height=25 autostart="false" cache="false" controls="controlpanel">fichi
Vider le cache de l'explorer en programmation Php ou JS [ par Cr0w ]
Bonjour,J'aimerai savoir si il existe une fonction en Php ou JavaScript permettant de vider le cache de l'explorer.En effet, j'ai conçu dans le cadre
cache limiter [ par brok ]
quand j'appelle ma page page.php, je recoit le message d'erreur suivant:Warning: Cannot send session cache limiter - headers already sent (output star
Retouches sur un scripts [ par apz ]
salut,ce script php, un guestbook, est le livre d'or que je cherchais.mais voila il se base sur les Class, que je ne connais pas desormais.alors je vo
differnec entre php 4 et php5 [ par hardelgylls ]
Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu
Doc PHP5 sniff sniff [ par slhuilli ]
Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est
fatal error sur chargement de class [ par fabrice_pi ]
salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|