|
|
|
|
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) |
|
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 :
- recevoir la requête pour une ressource
- vérifier s'il existe une version "cachée" de cette ressource
- c'est le cas, vérifier si elle est toujours valide
- 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
- 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 :
<?php
header('Expires: Mon, 15 May 2006 15:19:41 GMT+2');
header('Cache-Control: max-age=3600, must-revalidate');
?>
|
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|