Publié le 05/11/2013
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
3 plus
0 commentaires

Cache Fichier avec compression

Chaque page HTML d'un site internet peut être mise en cache sur le serveur pour une utilisation ultérieure. Bien souvent, le code source est stocké sous forme d'un fichier dans un dossier du serveur ou sur un CDN.
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.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
05/11/2013
Visualisation
vu 2296 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par hhhhh dans java

oooooooooooooooooooo

Publié par rsuinux dans php5

Merci pour cet article.
Cela m'a debloque pour sqlite3 sur openwrt :)
Cordialement.

Publié par amelia dans java

pour 30 sa donne 1346269

Publié par Roy2014 dans tuto

Bonjour et merci pour ce tuto interessant. Je pense que tout le monde souffre avec 1and1 du fait que l'on puisse pas gziper directement via le htaccess!!
j'aurais une petite question:
tu dis a p...

Publié par Tom dans java

Hello!
Cependant, mon Eclipse ne reconnait pas HttpLoader comme type valide...
Comment faire pour que ca marc...