Publié le 05/11/2013
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
0 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 3158 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 265 articles
|BIO_PSEUDO|
Commentaires récents

Publié par jmc dans CMS

Autre lien de chargement : http://www.fobec.com/protec/logiciels2/encadre.php3?id_log=217&cat=VBureautique

Publié par fobec dans CMS

fff - f,f,fklmf @@ f,kflf,k ??? !!! fff f f insert

Publié par Fobec dans php5

Bonjour,
vous pouvez poster un message sur le forum, la communaut vous donnera un coup de main pour la mise en place du script.

Publié par coramarr dans java

Peut-on trouver des infos sur cette suite qui serait utilise en statistiques. Des documents ou ouvrages qui relatent les divers possibilites d'utilisation de cette suite.
Je suis un particulier ni...

Publié par Fobec dans CMS

Norton emet une alerte de type 'Suspicious.Cloud', hasard de compilation ou menace serieuse ? Faites attention en installant le logiciel.<br>Merci JM de l'avoir signaler.