Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

URL Rewriting et mise en cache

Il est possible d' utiliser le MOD_Rewrite d' Apache pour servir un petit système de cache. Le principe est simple ...

Il consiste uniquement à verifier qu' une page en cache (statique) existe bien, et dans ce cas, réecrire l'URL vers cette page statique, ou si elle n' existe pas, un script PHP est appelé pour la regénérer.

Il suffit alors d'appeler régulierement un garbage collector pour faire le ménage et forcer la reconstruction du cache. Une tache CRON exécutée au rythme de votre choix est tout indiquée dans ce cas la.

Précisions

Tous nos fichiers statiques (cache) seront stockés dans le meme repertoire que le script. Ils porteront le nom : accueil.html.cache par exemple pour la page d' accueil

On prendra comme exemple un système de pseudo frames.

On utilisera donc les urls du style :

- http://votresite.com/accueil.html
- http://votresite.com/source.html
- http://votresite.com/autre.html

vers

- http://votresite.com/frames.php?page=accueil
- http://votresite.com/frames.php?page=source
- http://votresite.com/frames.php?page=autre

... en prenant bien soin de réécrire l'URL vers le fichier statique, en cache, s'il existe, c'est le role du fichier .htaccess suivant :

1) Le fichier .htaccess

On vérifie que la page statique, en cache, existe, et on l'appelle, sinon on appelle le script PHP chargé de la regénérer.

<?php
RewriteEngine on

# On vérifie que le fichier en cache existe
RewriteCond %{REQUEST_FILENAME}.cache -f

# La condition est vérifiée
# On réécrit donc l URL vers ce fichier statique
RewriteRule ([^.]+).html$ /$1.html.cache [L]

# La condition précédente n' a pas été exécutée , le fichier cache n'existe donc pas
# (elle comportait le flag [L] qui aurait mis fin a l exécution)

# Il n existe pas : on apelle le script PHP chargé le regénérer
RewriteRule ([^.]+).html$ /page.php?page=$1 [L]
?>

2) Un exemple de la page frames.php

Un simple système de pseudo frames classique, auquel on a ajouté une capture de flux (fonctions ob_*) avec enregistrement dans un fichier cache, puis finalement affichage.

<?php
// dossier qui stocke le cache
$dir_cache = './';

// début de la mise au tampon
ob_start();

// --------------------------------
// votre code HTML de début de page
// --------------------------------

switch($_GET['page']) {

case 'source' :
echo 'page source : '.date('H:i:s')

break;

case 'autre' :
echo 'autre page : '.date('H:i:s');
break;

case 'accueil' :
default :
echo 'page d accueil : '.date('H:i:s');
$_GET['page'] = 'accueil';
break;
}

// -------------------------
// suite et fn de votre page
// -------------------------


// écriture du tampon dans un fichier cache
$fp = fopen($dir_cache.$_GET['page'].'.html.cache', 'w+');
fwrite($fp, ob_get_contents());
fclose($fp);

// Affichage du tampon
ob_end_flush();

?>

3) Regénérer le cache

Voici un exemple de script PHP pour forcer la reconstruction du cache.
On efface tous les fichiers en cache.
Vous pouvez par exemple apeller ce script a l' aide d' une tache CRON chaque nuit.
... Rien ne vous empeche d'améliorer cette reconstruction du cache, en forcant le recalcul de la page de votre choix à la demande, et uniquement celle la !

<?php
$dir_cache = './';
$handle=opendir($dir_cache);

while ($file = readdir($handle)) {
$path = $dir_cache.$file;
if (substr(strrchr($path, '.'), 1) === 'cache' ) {
@unlink($path);
echo $path.' supprimé <b />';
}
}
closedir($handle);
?>


Je tiens à remercier tout particulièrement Fabrice Lezoray pour ses informations sur l'url-rewrite qui m'ont permis de réaliser cette partie spécifique.
ADAM Benjamin 2008 | Admin