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

Publié par Fobec dans java

Les images statiques sont aussi devenues payantes chez Google. Donc sans compte et une cle, l'image ne se chargera pas.
Je vous conseille de passer sur un autre fournisseur de carte, le code re...

Publié par bob le poisson dans java

Bonjour, votre script est tres bien mais attention l'utilisation du mot cle static sur la methode scale(BufferedImage bImage, double factor) est inutile et empeche de liberer la ressource.

Publié par Axel dans java

merci Neoray pour ce commentaire
Effectivement, l'objet Calendar s'initialise sur l'heure GMT avec TimeZone.getTimeZone("UTC");
Calendar.getInstance(TimeZone.getTimeZone("...

Publié par snoop dans java

simple, rapide et effectif du premier coup.
Merci!

Publié par Romaingineer dans tuto

Question un peu similaire celle de nicolasterraes.

Je ne trouve pas de ligne dans wpcontentthemes, j'en trouve 2 ou trois dans WP includes mais qui utilsent la fonction echo...

Du coup...