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 2457 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par arthur dans java

essaye avec une while, cela devrais marcher. mais après je ne sais pas comment paramétrer. c'est toi qui voit

Publié par Fobec dans java

As-tu essaye sans le parametre de la cle ?
(supprimer la ligne url += "&key=" + this.ApiKey;)
A priori, cela fonctionne sans aucune authentification sur l'api ;)

Publié par Amal dans tuto

pour moi j'ai créé une liste déroulante en liaisant avec la base de donnée déja existant mais la valeur sélectionné ne peut pas etre afficher jamais et...

Publié par jean-francois dans logiciel

Bonjour,
je suis tombe par hasard sur cette page que je trouver super. je cherche a faire quelque chose comme ca sur mon site. Et je galere depuis des jours... :(
Est-ce que tu partages le...

Publié par Axel dans java

le resultat de la fonction getMacAddress() est de type String,
ainsi pour afficher l'adresse MAC dans une JLabel

String macAddress=NetworkHardware.getMacAddress();
label.setText(macAd...