<?php

// ------------------------------------------------------------------------- //
// Système de cache                                                          //
// ------------------------------------------------------------------------- //
// Auteur: Matthias Etienne <matt@php-test.com>                              //
// Web:    http://www.php-test.com                                           //
// ------------------------------------------------------------------------- //

/*
Voici un exemple de mis en cache de pages web (contenant par exemple des
requêtes sql) que j'ai élaboré afin de réduire le temps d'accès à certaines
pages de mon site. Le principe est de vérifier l'état du cache (sa durée de
vie) : si celui-ci a expiré, on recrée le cache et on l'affiche. Sinon, on
affiche directement le cache.
L'idée m'est venu en étudiant le système de parsing des news de phpinfo.net.
*/

?>

<?

//fichier fonctions.php

/*******************************************
Fonction de verification de l'etat du cache
********************************************/
// duree cache en secondes !

function Verif_cache($fichier_cache, $duree_cache){

    if(
is_file($fichier_cache) == true){
        
$modification_time = filemtime($fichier_cache);
        
$actuel_time = time();

        if((
$actuel_time - $modification_time)>$duree_cache){
            return
false;
        }else{
            return
true;
        }
    }
}

/********************************************
Fonction de creation du cache
*********************************************/
function Creer_cache($fichier_cache,$contenu){
    
$fp=@fopen("$fichier_cache","w+");
    if(!
$fp) {return false;}
    else{
        
fputs($fp,"$contenu\n");
        
fclose($fp);
        return
true;
    }
}
?>

<?
//fichier exemple.php
include "fonctions.php"; //on inclut les fonctions

/* on vérifie l'ancienneté du cache grace à la fonction
Verif_cache. La durée est exprimée en secondes.
On met donc 604800 pour une semaine
*/

if(!Verif_cache("edito.cache.htm", 604800)){

    
// Cas où le cache est expiré (la fonction
    //     renvoie false)
    // on fait donc la requete

    
mysql_connect("$serveur","$user","$password")
    or die (
"Impossible de se connecter a mysql !");
    
mysql_select_db($base) or die ("Impossible d' acceder à la base !!!");
    
$resultat = mysql_query("select * from edito order by date desc Limit 1");
    
$num = mysql_num_rows($resultat);

    if (
$num!=0)
    {
      while (
$res=mysql_fetch_row($resultat))
      {
        
$titre = mysql_result($resultat,$i,"titre");
        
$Date = mysql_result($resultat,$i,"date");
        
$texte = mysql_result($resultat,$i,"texte");

    
//On crée une variable $cache dans laquelle
    // on met le contenu du futur cache

        
$cache.="$titre le $Date";
        
$cache.="<br>$texte";
      }
    }

    
// ON CREE LE CACHE
    
if(!Creer_cache("edito.cache.htm","$cache")){
        
// cas où erreur
        
echo "Impossible de créer le cache.";
        
mysql_close();
    }else{
        
// le cache a été recréé: on l'inclu ds la pge
        
include "edito.cache.htm";
        
mysql_close();
    }

}else{
    
// si le cache n'a pas expiré on l'inclu.
    
include "edito.cache.htm";  
}

?>