Créer un système de cache
Les connections à MySQL prennent toujours beaucoup de ressources serveur car il faut que celui-ci se connecte à la BDD, demande les informations, les récupère et ferme la connection. Tout ce processus est extrèmement lent et demande beaucoup de ressources. C'est pourquoi le système de cache demandra simplement au serveur d'afficher le contenu d'un fichier texte, de qui est beaucoup plus rapide.

Mais si on utilise un simple fichier texte, à quoi servent encore les informations stockées dans la BDD? On peut donc supprimer les tables?

Non car le système de cache ne permet pas de s'affranchir du la BDD mais simplement de diminuer le nombre de connections à celle-ci car ce fichier cache contient toutes les données déjà formatées (mises en forme, le code HTML est déjà inclu).
Voici donc ce qui se passe lorsqu'un visiteur demande à afficher une page:
-si le fichier cache n'existe pas, on le crée et on affiche son contenu
-si il existe mais est trop vieux, on crée un nouveau fichier cache et on affiche son contenu
-si le fichier cache existe et est à jour, on se contente d'afficher son contenu, sans connection à la BDD.

Comme le fichier cache sera le plus souvent à our, le nombre de connections à la BDD sera quasiment nul.
Créer un système de cahce est donc bénéfique pour l'hébergeur qui économise des ressources serveur et pour vos visiteurs pour qui l'affichage des pages sera grandement accéléré.

Passons au code

Il y a plusieurs méthodes pour créer un système de cache. Soit "écrire" tout ce qui doit être affiché à l'écran dans une variable et stocker ensuite le contenu de celle-ci dans un fichier ou alors écrire les informations dans la mémoire tampon (mémoire RAM, appellée aussi mémoire vive ->c'est une mémoire à court terme. A la fin de la génération de votre page, celle-ci est vidée) et à copier le contenu de cette mémoire tampon dans le fichier texte. C'est la seconde méthode que je vais vous apprendre à utiliser.

Pour écrire dans la mémoire tampon, il suffit d'utiliser un simple "echo", mais pas n'importe comment.
En premier lieu, nous allons lancer une fonction qui va indiquer au serveur que nous allons écrire dans la mémoire tampon et une seconde qui indique que nous avons terminé d'écrire dans cette mémoire:

ob_start();//Démarrage de l'écriture en mémoire tampon
echo 'Salut, je suis du texte écrit en mémoire tampon!';
ob_end_clean();//Arrêt de l'écriture en mémoire tampon

Vous pouvez tester ce code, rien ne s'affichera sur votre page pour la bonne raison que la fonction "ob_end_clean()" vide la mémoire tampon en la fermant. C'est donc comme si vous n'avez rien fait.
Nous allons donc avoir recours à une astuce (ainsi qu'à une fonction) pour pallier à ce problème.
Nous allons en effet créer une variable qui contiendra tout ce qui a été écrit dans la mémoire tampon.

Comment stocker dans une variable tout le contenu de la mémoire tampon?

Grâce à la fonction "ob_get_contents() qui renvoir toutes les informations souhaitées.

Voici un petit exemple d'utilisation de cette mémoire:

ob_start();//Ecriture en mémoire tampon
echo'Welcome to the tampon memory!';
$contenu = ob_get_contents();//Stockage du contenu dans une variable
ob_end_clean();//Arrêt et vidange de la mémoire
echo $contenu;
//Ecriture du contenu

Vous pouvez tester ce code, vous verrez la phrase écrite dans la mémoire tampon s'afficher.

Application



Nous allons immédiatement tester ce petit système sur un script de news.
Commenceons donc:

ob_start();
//Début du script de news
$connection = mysql_connect('localhost', 'root', '');
if (!$connection) {
    die('Connexion impossible : ' . mysql_error());
}
mysql_select_db('my_data_base');
$requete = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 5');
//Sélection des 5 dernier messages

while ($donnees = mysql_fetch_array($requete)){
echo'<div class="news">
<div class="titre_news">'
.$donnees['titre'];
echo'<em>  Le '.date('d/m/Y à H\hi', $donnees['timestamp']).'</em>
</div>
<p>'
.$donnees['contenu'];
echo'</p>
</div>'
;
}
mysql_close($connection);
//Fin du script de news

$contenu = ob_get_contents();
ob_end_clean();

Voici donc un exemple (très bref) de script de news écrit dans la mémoire tampon.

N'utilisez pas ce script de news, il n'est pas sécurisé. C'est juste pour l'exemple.

Il suffit maintenant d'écrire tout le code HTML généré dans le fichier cache grâce à la fonction "file_put_contents(fichier, contenu)".
Cette fonction écrit tout le contenu de la variable "contenu" dans le fichier "fichier".
Exemple:

...//Début du script
$contenu = ob_get_contents();
ob_end_clean();
file_put_contents($fichier_cache, $contenu);

Maintenant que vous êtes capable de créer un système de cache, il ne reste plus qu'à vérifier si le fichier est à jour et si ce n'est pas le cas, le créer avec la méthode que vous venez de lire.

Mais comment faire pour savoir si un fichier est à jour ou non?

Pour ce faire, nous allons utiliser la fonction "filemtime()" qui nous renvoie la date de la dernière modification.

Tout notre code de mise à jour du fichier cache devra donc être contenu dans un "if".
En premier, nous allons stocker dans une variable la durée maximale avant la modification du fichier. Ensuite, il suffit de faire un "if" pour vérifier si le fichier est ou non à jour.

$duree = 3600;
//Le fichier cache aura une durée de vie maximale de 3600 secondes

$fichier_cache = 'nom_de_mon_fichier_de_cache.cahce';
/*On stocke dans une varialbe le nom du fichier de cache pour se simplifier la vie.  J'ai l'habitude
d'utiliser la terminaison ".cache" pour mes fichers cache mais ce n'est pas une obligation.*/


if(file_exists($fichier_cache) && filemtime($fichier_cache) > $duree){
/* Si le fichier existe (on est jamais trop prudent) et que la durée de vie est dépassée, on met
à jour le fichier cache*/

.....
}
else{
//Si le fichier de cache est à jour, on le lit.
}

Si le fichier de cache est à jour, on le lit.
Mais comment lire un fichier en PHP?
Il existe bien évidamment les fonctions "fopen", "fgets" et "fclose" mais c'est long et compliqué. (Utiliser 3 fonctions ainsi que des boucles multiplie le risque d'erreurs"). Pour pallier à ce problème, le PHP dispose d'une fonction toute faire pour stocker tout le contenu d'un fichier dans une variable: "readfile(fichier);".
Dans votre "else", il suffira de taper ces lignes:

$contenu = readfile($fichier_cache);
echo $contenu;

Votre système de cache est maintenant terminé!
Voici un code (shématique) de votre système de cache:

$duree = X;
$file = 'mon_fichier.cache';
if(file_exists($file) && filemtime($file) > $duree){
ob_start();
...Ecriture du code...
$contenu = ob_get_contents();
ob_end_clean();
echo $contenu;
file_put_contents($file, $contenu);
}
else{
$contenu = readfile($file);
echo $contenu;
}

Veillez à ce que le système de cache ne puisse pas mettre en cache des informations sensibles (par exemple, des boutons que seul l'admin peut voir!).


Creative Commons License
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons
Page générée en 0.4048 secondes.
Retour en haut de la page
Imprimer cette page