HDAcache
Mettre en cache vos pages PHP et les restituer à la demande.
La classe HDAcache fournit des fonctions permettant de mettre tout ou partie d'un document PHP en cache, d'en forcer le recalcul, soit après un délai fixé, soit à la demande. Copier le fichier de classe dans un répertoire accessible en inclusion, puis créer un répertoire cache dans le dossier des scripts dans lesquels vous souhaitez utiliser la classe de cache.
Les Méthodes
- HDAcache - Nouvelle Instance
- start_cache - Début de la mise en cache
- end_cache - Fin de la mise en cache
- force_cache - Forcer le recalcul
Exemples
La Source
<?php
/*************************************
CLASSE DE CACHE PAR BLOC
par fablezouave
http://www.scriptsphp.net
customisé par Tetsuo
***************************************/
class HDAcache {
var $cachename;
var $valid;
var $rebuild;
var $gc_max;
function HDAcache($time,$zone='',$gctimemax=86400) {
// modifier la valeur par defaut au besoin (en secondes)
$this->rebuild = 0;
// durée max du cache pour le fichier courant
$this->valid = $time;
// durée max du cache
$this->gc_max = $gctimemax;
// Repertoire contenant le cache
$this->store_dir = 'cache';
$this->zone = $zone;
// On recupere les parametre de l'url
// puis on les classe alphabetiquement
// enfin on recompose les parametres...
$array_get=$_GET;
if (isset($array_get['rebuild'])) {
unset($array_get['rebuild']);
$this->rebuild=1;
}
ksort($array_get);
$array_qs = array();
foreach( $array_get as $key => $val ) {
array_push($array_qs, $key.'='.$val);
}
$sorted_query_string=implode('&',$array_qs);
// On crée un identifiant unique
// de chaque element du cache basé sur
// le nom du fichier et ses parametres
$this->cachename=$this->store_dir.'/'
.md5(basename($_SERVER['PHP_SELF'])
.$zone.$sorted_query_string).'.cache';
// si on a passé rebuild en parametre d'url
//on force ici le recalcul de la page
if ($this->rebuild==1) HDAcache::force_cache();
// on execute ici l'appelle du ramasse miette
// 1 fois sur 100
srand((double)microtime()*1000000);
if (!rand(0,99)) HDAcache::gc();
}
function add_header($ftime) {
if ( isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
$since = strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
if ( $since + $this->valid > time() ) {
header('HTTP/1.x 304 Not Modified');
exit;
}
}
if ( !$this->rebuild ) {
header("Expires: ".gmdate("D, d M Y H:i:s",time()+$this->valid/2)." GMT"); // Date d'expiration H + validité/2
} else {
header("Expires: ".gmdate("D, d M Y H:i:s",time() )." GMT"); // Expire de suite ... pour garder le controle du cache
}
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $ftime ) . " GMT"); // derniere modification
}
function start_cache() {
/*
ici on vérifie la validité du cache
et soit on renvoi le contenu du cache
soit on demarre la mise au tampon
*/
$file = $this->cachename;
$Tout = time() - $this->valid;
if ( (file_exists($file)==1) && ( filemtime($file) > $Tout ) && ( empty($_POST) ) ) {
if (!headers_sent()) {
$this->add_header(filemtime($file));
}
$fd=fopen ($file, "rb");
@flock($fd,1);
echo fread($fd,filesize($file));
@flock($fp,3);
fclose ($fd);
//readfile($this->cachename);
echo "<!--FROMCACHE-->";
return TRUE;
}
else {
if (!headers_sent() && !$this->zone) {
//if (file_exists($file)) { $ht=filemtime($file); } else { $ht=time(); }
$ht=time();
$this->add_header($ht);
}
ob_start();
return FALSE;
}
}
function end_cache() {
/*
ici on recupere le tampon pour l'afficher
et pour le stocker ds le cache
*/
$data_cache = ob_get_contents();
$fp = @fopen($this->cachename, "wb+");
if(!$fp) return FALSE;
@flock($fp,2);
@fputs($fp, $data_cache);
@flock($fp,3);
@fclose($fp);
ob_end_flush();
echo "<!--REBUILD-->";
return TRUE;
}
function force_cache(){
/*
ici on supprime le fichier courant du cache
pour forcer le recalcule de la page
*/
$file = $this->cachename;
@touch($file, time()-($this->valid +1));
if ( filemtime($file)>time()-$this->valid ) {
HDAcache::delfile($file);
}
else return TRUE;
}
function gc() {
/*
Ici on a une routine de ramasse miette
qui nettoie le contenu du cache des fichiers hors d'age
et evite d'avoir un cache trop volumineux
tout les fichiers dont l'age est supérieur a gc_max
sont supprimés
*/
$handle=opendir(dirname($this->cachename));
while ($file = readdir($handle)) {
$path=dirname($this->cachename).'/'.$file;
if (
is_file($path)
&& filemtime($path)<time()-$this->gc_max
&& $file!='.htaccess' ) {
HDAcache::delfile($path);
}
}
closedir($handle);
}
function delfile($file) {
/*
là une routine qui permet l'effacement du fichier file
sous unix puis windows
*/
@unlink($file);
clearstatcache();
if (@file_exists($file)) {
$filesys = str_replace("/", "\\", $file);
@system("del $filesys");
clearstatcache();
if (@file_exists($file)) {
@chmod ($file, 0775);
@unlink($file);
@system("del $filesys");
}
}
clearstatcache();
if (@file_exists($file)) return FALSE;
else return TRUE;
}
}
?>
/*************************************
CLASSE DE CACHE PAR BLOC
par fablezouave
http://www.scriptsphp.net
customisé par Tetsuo
***************************************/
class HDAcache {
var $cachename;
var $valid;
var $rebuild;
var $gc_max;
function HDAcache($time,$zone='',$gctimemax=86400) {
// modifier la valeur par defaut au besoin (en secondes)
$this->rebuild = 0;
// durée max du cache pour le fichier courant
$this->valid = $time;
// durée max du cache
$this->gc_max = $gctimemax;
// Repertoire contenant le cache
$this->store_dir = 'cache';
$this->zone = $zone;
// On recupere les parametre de l'url
// puis on les classe alphabetiquement
// enfin on recompose les parametres...
$array_get=$_GET;
if (isset($array_get['rebuild'])) {
unset($array_get['rebuild']);
$this->rebuild=1;
}
ksort($array_get);
$array_qs = array();
foreach( $array_get as $key => $val ) {
array_push($array_qs, $key.'='.$val);
}
$sorted_query_string=implode('&',$array_qs);
// On crée un identifiant unique
// de chaque element du cache basé sur
// le nom du fichier et ses parametres
$this->cachename=$this->store_dir.'/'
.md5(basename($_SERVER['PHP_SELF'])
.$zone.$sorted_query_string).'.cache';
// si on a passé rebuild en parametre d'url
//on force ici le recalcul de la page
if ($this->rebuild==1) HDAcache::force_cache();
// on execute ici l'appelle du ramasse miette
// 1 fois sur 100
srand((double)microtime()*1000000);
if (!rand(0,99)) HDAcache::gc();
}
function add_header($ftime) {
if ( isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
$since = strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
if ( $since + $this->valid > time() ) {
header('HTTP/1.x 304 Not Modified');
exit;
}
}
if ( !$this->rebuild ) {
header("Expires: ".gmdate("D, d M Y H:i:s",time()+$this->valid/2)." GMT"); // Date d'expiration H + validité/2
} else {
header("Expires: ".gmdate("D, d M Y H:i:s",time() )." GMT"); // Expire de suite ... pour garder le controle du cache
}
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $ftime ) . " GMT"); // derniere modification
}
function start_cache() {
/*
ici on vérifie la validité du cache
et soit on renvoi le contenu du cache
soit on demarre la mise au tampon
*/
$file = $this->cachename;
$Tout = time() - $this->valid;
if ( (file_exists($file)==1) && ( filemtime($file) > $Tout ) && ( empty($_POST) ) ) {
if (!headers_sent()) {
$this->add_header(filemtime($file));
}
$fd=fopen ($file, "rb");
@flock($fd,1);
echo fread($fd,filesize($file));
@flock($fp,3);
fclose ($fd);
//readfile($this->cachename);
echo "<!--FROMCACHE-->";
return TRUE;
}
else {
if (!headers_sent() && !$this->zone) {
//if (file_exists($file)) { $ht=filemtime($file); } else { $ht=time(); }
$ht=time();
$this->add_header($ht);
}
ob_start();
return FALSE;
}
}
function end_cache() {
/*
ici on recupere le tampon pour l'afficher
et pour le stocker ds le cache
*/
$data_cache = ob_get_contents();
$fp = @fopen($this->cachename, "wb+");
if(!$fp) return FALSE;
@flock($fp,2);
@fputs($fp, $data_cache);
@flock($fp,3);
@fclose($fp);
ob_end_flush();
echo "<!--REBUILD-->";
return TRUE;
}
function force_cache(){
/*
ici on supprime le fichier courant du cache
pour forcer le recalcule de la page
*/
$file = $this->cachename;
@touch($file, time()-($this->valid +1));
if ( filemtime($file)>time()-$this->valid ) {
HDAcache::delfile($file);
}
else return TRUE;
}
function gc() {
/*
Ici on a une routine de ramasse miette
qui nettoie le contenu du cache des fichiers hors d'age
et evite d'avoir un cache trop volumineux
tout les fichiers dont l'age est supérieur a gc_max
sont supprimés
*/
$handle=opendir(dirname($this->cachename));
while ($file = readdir($handle)) {
$path=dirname($this->cachename).'/'.$file;
if (
is_file($path)
&& filemtime($path)<time()-$this->gc_max
&& $file!='.htaccess' ) {
HDAcache::delfile($path);
}
}
closedir($handle);
}
function delfile($file) {
/*
là une routine qui permet l'effacement du fichier file
sous unix puis windows
*/
@unlink($file);
clearstatcache();
if (@file_exists($file)) {
$filesys = str_replace("/", "\\", $file);
@system("del $filesys");
clearstatcache();
if (@file_exists($file)) {
@chmod ($file, 0775);
@unlink($file);
@system("del $filesys");
}
}
clearstatcache();
if (@file_exists($file)) return FALSE;
else return TRUE;
}
}
?>