begin process at 2012 05 27 20:30:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > SYSTÈME DE CACHE POUR SITE EN PHP5

SYSTÈME DE CACHE POUR SITE EN PHP5


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Classé sous :cache, php5, class Niveau :Initié Date de création :22/04/2008 Date de mise à jour :24/04/2008 11:12:52 Vu :5 108

Auteur : Petit bateau

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 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

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
CLASS PAGINATION PHP5 POO par mtrix000
Source avec Zip Source avec une capture CLASS DE MENU DÉROULANT PHP5 par cedriclomb
CLASS DE PAGINATION par NainPuissant

Commentaires et avis

Commentaire de garfield90 le 22/04/2008 18:10:02

quelques petits trucs que je trouve dommage :

tu utilises des constantes globales dans ta classes => a proscrire car si on fais pas attention ca peut engendrer des soucis (en plus on ne connait pas leur utilité, type, ...). A la rigueur utilise des constantes de classes.

toutes tes methodes et propriétés sont statics, ouaip pourquoi pas mais je trouve illogique que tu puisses modifié une propriété dans une methode static qui pour moi ne devrait pas en avoir (de propriété). Je la mettrai en classique.

lorsque tu étends ta classe Cache, tu le fais mal.
pourquoi ne pas profiter renomme tu tes méthodes parentes ? tu pourrais simplement les étendre.
méthode obtenirDonnee => methode lire
et tu aurais :
function lire($groupe, $id){
   return unserialize(parent::lire($groupe, $id));
}

je ne suis pas totalement d'accord avec ta construction de classe, obtenirDonnee(j'ai repris ton nom de méthode afin de ne créer de mauvaise interpretation) ne doit jamais vérifier la présence du cache, tu dois le faire en amont (cas de figure ou ta donnée mis en cache est vide et que cela est normal). Tu risques d'effectué des traitements pour rien.

Pour moi, le cache fonctionne toujours de la meme maniere.

if ( ! $oCache->isCached($id) || !$oCache->isValid($id) ){
   $oCache->start();
   // traitement a mettre en cache
   $oCache->save($id, $oCache->end());
}
$sContent = $oCache->get($id);

la validité et le fait d'être mis en cache sont 2 informations distinctes

My 2 cents concernant ta classe


Commentaire de Petit bateau le 22/04/2008 19:02:02

Salut,

Oui effectivement, j'utilisais ma constant CACHE dans mon script, j'ai oublié de la supprimé.
Je posterais la correction tout à l'heure ou demain.

Merci pour tes remarques, j'en tiendrais compte pour la corriger ;-)

Merci

Commentaire de Petit bateau le 22/04/2008 19:21:46

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

Commentaire de garfield90 le 22/04/2008 19:37:23

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

Commentaire de Petit bateau le 23/04/2008 11:04:13

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.

Commentaire de Rulio le 23/04/2008 21:49:52

Salut,

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

self::$group = $groupe;

Commentaire de Petit bateau le 24/04/2008 11:12:19

Salut,

Effectivement, merci je corrige :-)

 Ajouter un commentaire


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 :&lt;? 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 :&lt;embed src="fichier.wav" width=145 height=25 autostart="false" cache="false" controls="controlpanel"&gt;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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales