TUTORIEL PHP 
Créer un système de cache en PHP
Théorie et implémentation en PHP de deux techniques de cache, l'une utilisant les en-têtes HTTP, l'autre passant par la mise en tampon des données. (15/05/2006)
<< 1. Théorie et cache navigateur
2. Cache serveur

Cache serveur
Pour pousser la sauvegarde de ressources serveur plus loin, il faut demander à PHP de produire le contenu HTML à partir de la page PHP, stocker ce contenu dans un dossier du serveur, et servir ce contenu aux navigateurs.

Un cache simple et rapide à mettre en place utilise les fonctions de bufferisation de sortie de PHP (lire notre article du 06/02/06). Ces fonctions stockent les données HTML dans un tampon mémoire avant de les envoyer au navigateur, afin d'y appliquer certains traitements. L'étape supplémentaire consiste donc à faire une copie de ce tampon dans un dossier du serveur.

Nous avons déjà vu dans cet article précédent comment travailler avec le tampon. Reste à développer la bufferisation pour qu'elle sauve les données sur le serveur.

Pour s'assurer que chaque ressource est cachée individuellement, les données HTML seront stockées sous un nom de fichier unique, utilisant le hash md5 de l'URL complète de celle-ci. Le script vérifiera si le fichier [hash-md5].cache existe dans le dossier /cache/. Si lors de la requête, le fichier correspondant à son hash md5 existe, et qu'il n'a pas dépassé sa date limite, c'est celui-ci qui est renvoyé. Sinon, le fichier .cache est recréé, et envoyé au navigateur.

Pour une mise en tampon normale, le contenu dynamique de la page est encadré de deux fonctions : l'une pour valider le contenu, l'autre pour l'afficher. Pour simplifier, on placera les fonctions dans deux fichiers à part, appelés avec la directive include() : lancer_cache.php et finir_cache.php.

lancer_cache.php peut prendre la forme suivante :
  1. <?php
  2. $dossier_cache = '../cache/';
  3. $secondes_cache = 60*60*12; // 12 heures
  4.  
  5. $url_cache = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  6. $fichier_cache = $dossier_cache . md5($url_cache) . '.cache';
  7.  
  8. $fichier_cache_existe = ( @file_exists($fichier_cache) ) ? @filemtime($fichier_cache) : 0;
  9.  
  10. if ($fichier_cache_existe > time() - $secondes_cache ) {
  11.   @readfile($fichier_cache);
  12.   exit();
  13.   }
  14. ob_start();
  15. ?>
On voit que le début du script vérifie la présence du fichier et sa validité, et le cas échéant lance la procédure de mise en tampon, ob_start(). Après cela, la page se déroule comme prévu, et se termine par finir_cache.php :
  1. <?php
  2. $pointeur = @fopen($fichier_cache, 'w');
  3. @fwrite($pointeur, ob_get_contents());
  4. @fclose($pointeur);
  5. ob_end_flush();
  6. ?>
  Forum

Réagissez dans les forums de JDN Développeurs

Si l'on atteint finir_cache.php, c'est que le cache n'a pas été affiché et qu'un nouveau cache tampon a été créé. Il nous faut donc ouvrir un accès fichier, y placer le contenu du tampon, fermer le fichier... et envoyer le contenu du tampon vers le navigateur. Pendant les douze prochaines heures, c'est ce fichier cache qui sera envoyé au navigateur, économisant ainsi de nombreux accès inutiles au compilateur PHP et à la base MySQL.

<< 1. Théorie et cache navigateur
2. Cache serveur
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages