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

Tous les grands sites Internet fonctionnent aujourd'hui à l'aide d'un langage dynamique, que ce soit PHP, ASP/ASP.Net, Perl... L'intérêt premier de cette technologie, face aux pages statiques en HTML, est de disposer d'un système de gestion de contenu afin de mettre à jour les textes et images sans devoir retoucher le code HTML affiché par le navigateur.

Reste que les pages dynamiques ne changent pas aussi souvent qu'on pourrait le croire, et que la charge imposée au serveur et à la base de données pour afficher toujours la même page peut amener à reconsidérer l'idée de passer par un système dynamique. C'est pour répondre à ce problème courant que des systèmes de cache ont été créés.

Ces systèmes marchent de la même manière que les caches du navigateur : plutôt que de générer le même document de nombreuses fois, le cache stocke une version statique du document généré dynamiquement, et la sert au navigateur. Cette version stockée sur le serveur est mise à jour selon des critères qui peuvent grandement varier.

Le fonctionnement fondamental d'un script de cache reste cependant le même pour toutes les implémentations :
  1. recevoir la requête pour une ressource
  2. vérifier s'il existe une version "cachée" de cette ressource
    • c'est le cas, vérifier si elle est toujours valide
      1. ce n'est pas le cas, créer une nouvelle version cachée et la stocker
    • si ce n'est pas le cas, créer une version cachée et la stocker
  3. envoyer la version cachée au navigateur
Cache navigateur
La validité d'un cache est décrétée par le développeur, qui utilise pour cela soit la balise Meta, soit les en-têtes HTTP. Ces derniers étant plus efficaces et reconnus, ils forment un standard dans la gestion du cache. Ces en-têtes ne sont pas lisibles dans la page HTML, et sont produit par le serveur lui-même - PHP pouvant demander au serveur de les produire selon certaines variables.

Le contrôle du cache navigateur est essentiellement réalisé par deux en-têtes : Expires et Cache-Control. Celles-ci sont comprises parmi la poignée d'en-têtes envoyée par le serveur avant le contenu HTML de la page. Ces en-têtes peuvent prendre cette forme :

HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Mon, 15 May 2006 15:19:41 GMT+2

Last-Modified: Wed, 12 May 2005 21:28:12 GMT+2
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html


Expires donne logiquement la date d'expiration de la page, donc la date à laquelle tout cache de cette page devrait être remplacé par une nouvelle version. Sa construction est donc très simple : il suffit d'y placer une date dans le bon format, et le navigateur se chargera de la traiter.

Cache-Control est plus délicat à maître en oeuvre, car cet en-tête dispose d'arguments optionnels :

Quelques arguments de
l'en-tête Cache-Control
Argument
Usage
max-age=nbrSecondes
le nombre de secondes durant lesquelles la page devra être conservée dans le cache du navigateur, à partir de l'instant de la requête de cette page
s-maxage=nbrSecondes
comme max-age, mais ne s'appliquant qu'aux proxys
public
Même si la page ne devrait pas être cachée en condition normale, public la rend "cachable"
private
Ressource à destination d'un utilisateur unique, ne devant donc jamais être caché de manière partagée, uniquement par un cache privé
no-cache
La ressource ne doit jamais être cachée
no-store
La ressource ne doit même pas être stockée sur le disque
no-transform
S'applique aux formats spéciaux, par exemple les images, que le cache intermidiaire peut transformer en un autre format pour économiser de l'espace
must-revalidate
Vérifie la validité du cache, même si le système de cache est configuré pour ne pas s'en soucier
proxy-revalidate
Idem, pour les caches intermédiaires


  Forum

Réagissez dans les forums de JDN Développeurs

PHP dispose d'une fonction pour modifier les en-têtes HTTP 1.1 : header(). Par exemple, placer en tête de script page, avant tout contenu HTML ou PHP, les appels suivants :
  1. <?php
  2. header('Expires: Mon, 15 May 2006 15:19:41 GMT+2');
  3. header('Cache-Control: max-age=3600, must-revalidate');
  4. ?>
  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