Dans l'article utiliser un système de cache HTML, nous avons quelques une des raisons et des solutions pour mettre en place un cache.
Class de lecture et sauvegarde de code HTML
A quoi sert la class LocalHtmlCache ?- enregistrer un code HTML dans un fichier, les données sont compressées,
- lire le code HTML d'une page internet,
- supprimer un fichier du cache,
- les constantes servent à définir la validité du cache.
<?php
/**
* LocalHtmlCache: Lire et enregistrer un cache fichier
*
* @author Fobec 2013
* http://www.fobec.com/php5/1134/cache-fichier-avec-compression.html
*/
class LocalHtmlCache {
/**
* Enregistrer le contenu d'une page HTML
* @param type $file path + nom du fichier
* @param type $html code html
* @throws Exception
*/
public static function save($file, $html) {
$zhtml=gzcompress($html);
$fhandle=@fopen($file,'w');
if ($fhandle) {
fwrite($fhandle, $zhtml);
fclose($fhandle);
} else if (isset($error)) {
throw new Exception("File writing denied to ".$file." !!!");
}
}
/**
* Charger le contenu d'une page HTML à partir du fichier cache
* @param type $file
* @param type $maxage duree en seconde
* @param type $error
* @return Mixed NULL / String
* @throws Exception
*/
public static function load($file, $maxage=null, $error=null) {
if (!file_exists($file)) {
if (isset($error)) {
throw new Exception("Unknow file ".$file." !!!");
}
return null;
}
//hors delai, cache perimé
if (isset($maxage)) {
$filedate=@filemtime($file);
if ((time()-$filedate)>$maxage) {
return null;
}
}
$fhandle=@fopen($file,'r');
if ($fhandle) {
$buf=stream_get_contents($fhandle);
$html=gzuncompress($buf);
return $html;
fclose($fhandle);
} else if (isset($error)) {
throw new Exception("File reading denied to ".$file." !!!");
}
}
/**
* Effacer un fichier cache
* @param string $file
*/
public static function deletefile($file) {
if (file_exists($file)) {
@unlink($file);
}
}
/***************************************************************************
* Duree de vie 1 heure 1 x 60 x 60
***************************************************************************/
const LIFE_ONEHOUR=360;
/***************************************************************************
* Duree de vie 1 journée 24 x 60 x 60
***************************************************************************/
const LIFE_ONEDAY=86400;
/***************************************************************************
* Duree de vie 1 semaine 7 x 24 x 60 x 60
***************************************************************************/
const LIFE_ONEWEEK=604800;
/***************************************************************************
* Duree de vie 1 mois 30 x 24 x 60 x 60
***************************************************************************/
const LIFE_ONEONTH=2592000;
}
?>
Sauvegarder et lire un fichier HTML
La première chose à faire est de définir une règle de nommage pour les fichiers du cache. En effet, le nom du fichier utilisé lors de l'enregistrement doit être unique pour retrouver les données lors de la lecture.Quelques idées:
- utiliser l'ID de la page: en général, le CMS stocke les données d'une page dans une base de donnée MySql. En index de la table on trouve un Integer autoincrémenté et unique. Dans cette solution, les fichiers se nommeront file_id_de_article.zhm,
- reprendre l'url: à partir de $_SERVER['REQUEST_URI'], on construit un nom de fichier valide en supprimant ou en remplaçant les caractères interdits.
<?php
/**
* Exemple de sauvegarde
*/
// Obtenir le code source de la page
// dépend fortement du CMS utilisé
// solution universelle avec ob_start(); ob_get_contents();
$html=ob_get_contents();;
//Fichier du cache en local
$file=$_SERVER['DOCUMENT_ROOT'].'/cache/file1.zhm';
//Enregistrer
LocalHtmlCache::save($file, $html);
/**
* Exemple de lecture
*/
//lire le fichier Cache
$file=$_SERVER['DOCUMENT_ROOT'].'/cache/file1.zhm';
$html=LocalHtmlCache::load($file);
if ($html!=null) {
echo $html;
} else {
//laisser le CMS afficher la page
}
?>
Fixer une date de validité du cache
La prochaine étape est de contrôler la validité des données mises en cache. Par exemple, une page du site internet doit être rafraîchit toutes les heures. La fonction LocalHtmlCache::load() retourne 2 types de valeurs:- null: si le fichier n'existe pas ou les données sont plus anciennes que LIFE_ONEHOUR,
- string: le code HTML de la page.
<?php
//Fichier du cache en local
$file=$_SERVER['DOCUMENT_ROOT'].'/cache/file1.zhm';
//Lecture à partir du cache
$html=LocalHtmlCache::load($file,LocalHtmlCache::LIFE_ONEHOUR);
if ($html!=null) {
echo $html.' Lecture a partir du cache';
} else {
//laisser le CMS afficher la page
$html=CMS_donne_HTML();
//Enregistrement du cache
LocalHtmlCache::save($file, $html);
echo $html.' Lecture a partir du CMS';
}
?>
Force et faiblesse du cache fichier
(force) simplicité: le cache fichier est facile à mettre en place,(force) performance: jusqu'à 10 000 fichiers par dossier, le temps de chargement est faible,les ressources allouées au chargement/sauvegarde sont quasi nulles.
(faiblesse) maintenance: puisque chaque page possède son fichier sur le serveur, il faut de nombreux dossiers dédiés au cache pour répartir les enregistrements. Sur un site internet de taille moyenne, on peut facilement perdre la supervision du système.