2

Système de cache en PHP

Bonjour les amis!

Aujourd’hui, une petite explication et démonstration bien utile de la gestion de données via un système de cache. Pas sur que cela soit utile sur tous les sites que vous aurez à développer, mais c’est toujours bon de connaître des moyens d’optimiser son site en cas de besoin.

Qu’y a-t-il de plus ennuyeux qu’un site long à charger lorsque l’on souhaite accéder à une information? Lorsque le moindre changement de page nous conduit à une attente à la limite du supportable, une sensation proche de celle que l’on peut ressentir lors du visionnage d’un film de Nicolas Cage…

Grâce à l’ami du développeur, vous allez découvrir comment éviter à vos visiteurs le supplice (Je ne parle plus de Nicolas Cage hein! Chacun est libre de se faire du mal après tout) d’attendre l’information cruciale que vous avez à leur fournir.

Un moyen relativement simple à appréhender mais qui peut prendre une dimension spectaculaire en terme d’optimisation pour les sites à fort trafic.

Je parle bien évidemment du susnommé, le cache.

Le cache, ça sert a quoi?

Récupération de données en base, traitement des informations (boucles, conditions,…) ou encore calculs mathématiques, voila à quoi ressemble bien souvent la dynamisation d’un site Internet.

Lorsqu’un visiteur arrive sur votre site, une requête est envoyé à votre serveur web, lui demandant d’exécuter un script et de vous retourner le code généré (Votre contenu HTML en gros).

Le script exécuté va utiliser des ressources serveur afin d’effectuer les requêtes en base, les calculs ou l’organisation de vos informations afin qu’elle soient retournées à l’internaute comme vous l’avez souhaité. Une fois ces informations retournées, elles vont alors rejoindre le scénario de Ghost Rider dans les profondeurs abyssales du Royaume de l’oubli.

Pourtant à la différence de Ghost Rider, votre code peut intéresser plus d’une personne. Il est alors dommage de sacrifier vos données générées qui pourraient resservir à d’autres internautes. Car aujourd’hui, sans système de cache, lorsqu’un autre visiteur arrivera sur votre site, les mêmes requêtes serveur, la même génération de code sera effectué pour lui donner les mêmes informations. Dans cette logique, multipliez le nombre de visiteurs par 10, 100 ou 1000 !

Votre serveur pourrait bien commencer à sentir le chaud.

C’est la que notre ami le cache entre en jeu et nous sauve tel un preux chevalier sur sa moto enflammée…

Le cache n’est en fait que le stockage des informations générées la première fois. Plutôt que de les laisser se perdre, nous allons les inscrire dans un fichier. Chaque nouveau visiteur récupérera le code déjà généré et toutes les ressources serveur utile à la génération de ces données la première fois seront alors sauvegardées.

Oui, mais, vous allez me dire, l’intérêt d’un site dynamique, c’est avant tout d’avoir des données dynamique… Logique.

Pour palier à ce problème, vous pouvez définir un temps de rafraîchissement de votre fichier de cache, en testant simplement sa date de dernière modification. Par exemple, si mon fichier de cache a été modifié il y a plus de 10min, alors j’indique à mon serveur de ré-effectuer la génération du code et d’écraser le code déjà présent dans mon fichier de cache. Ainsi vous obtenez un fichier cache pour les 10 prochaines minutes.

Il faut bien évidemment que vous fassiez un choix sur le taux de rafraîchissement de votre fichier de cache en fonction de l’importance de votre trafic et du volume de vos données.

C’est bien beau, mais comment on fait?

Afin de simplifier l’utilisation de nos données, nous allons utiliser la mémoire tampon. Vous allez voir c’est très simple.

$FichierCache = 'cache/index.html'; // On définit un fichier pour le cache
$expiration = time() -600 ; // On définit une validité du fichier cache (ici 10min)

if(file_exists($FichierCache) && filemtime($FichierCache) > $expiration) {
   readfile($FichierCache); // Si le fichier de cache existe et qu'il n'est pas périmé, on affiche le contenu du fichier
} else {
   // Sinon, nous récupérons nos données normalement
   ob_start(); // Ouverture de la mémoire tampon
   $data = 'Votre requête MySQL qui va bien'; // Récupération et traitement des données
   foreach($data as $d) {
      echo '<h3>'.$d['titre'].'</h3>';
      echo '<p>'.$d['contenu'].'</p>';
   }
   $donnees = ob_get_contents(); // On récupère les données présentes dans la mémoire tampon
   ob_end_clean(); // On ferme et on détruit la mémoire tampon
   file_put_contents($FichierCache, $donnees); // On insert nos données dans le fichier de cache
   echo $donnees; // On affiche les données de notre page
}

Simple, non ?

Pour être un peu plus précis, les fonctions ob_start() et ob_end clean() fonctionnent comme des délimiteurs. Tout ce qui se passe entre ces deux fonctions est stocké dans la mémoire tampon.

Grâce à ob_get_contents(), nous récupérons toutes les données après leur traitement afin de les stocker dans un fichier.

Vous n’êtes absolument pas obligé d’utiliser le tampon (sachez d’ailleurs que si vous utilisez une version antérieure à PHP5, il faudra vous en passez…). Vous pouvez tout à fait générer votre propre variable contenant vos données. A vous de voir ce que vous préférez !

En espérant que ce petit tuto puisse vous éclairer et vous aider dans la sage voie de l’optimisation.
Lâchez vos comm ! On les met en cache !

A propos de Romuald

Romuald a écrit 23 articles sur le blog.

Les amis de nos amis sont nos amis, alors partageons !

Laissez un commentaire





Si vous êtes un vrai développeur, vous devez savoir compter.
Alors on vous met au défi !
Si vous réussissez cette épreuve, nous nous ferons une joie de lire votre commentaire.