Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Points particuliers > Lecture du tutoriel

Un système de cache simple

Avatar
Auteur : Kermi
Créé : le 02/08/2006 15:30:19
Modifié : le 11/02/2008 15:53:32
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Beaucoup de sites ne sont malheureusement pas assez optimisés, et ceci pour plusieurs raisons :

Je vais vous apprendre dans ce tuto à réaliser un système de cache simple, basé sur un ou plusieurs fichiers (tout dépend si vous souhaitez ou non mettre un ou plusieurs caches) :) .

Nous prendrons l'exemple du menu "Livre d'or" du Site du Zér0 : chaque message est mis en cache pendant une minute pour ensuite être mis à jour en puisant un autre message dans la base de données.
Sommaire du chapitre :

Préparation du script

Nous allons commencer par préparer notre script. :)

Création du fichier .cache



Pour cela, il vous faut créer un fichier *.cache.

Par souci d'organisation, je vous conseille de mettre tous vos fichiers *.cache dans des dossiers différents, tous stockés dans le répertoire /cache ;) .

Pour notre script, nous allons créer un fichier cache contenant un message du livre d'or, qui changera toutes les minutes et qui s'affichera dans un block du menu. Cette information apparaîtra sur toutes les pages (puisque le menu est sur toutes les pages). Nous allons donc mettre ça directement dans le dossier /cache :

/cache/livre_or.cache

Créez donc ce fichier et mettez-le en CHMOD 777 (tous les droits).

Et ce fichier va me servir à quoi ?

En fait, je vais être franc avec vous, il ne vous servira à rien... par contre il sera très utile à PHP ! ^^

Ce fichier, PHP va s'en servir pour stocker des informations temporaires (ici, le message du livre d'or).
Sur votre site, ne s'affichera que le texte contenu dans le fichier, et non le texte issu de la requête SQL qui récupère les informations dans la base de données.

Cette requête ne s'effectuera que ponctuellement. Dans notre exemple, la requête s'exécutera qu'une seule fois toutes les minutes grâce à notre système de cache ! C'est un gain énorme de performance, et là est tout son intérêt !

Mais, mais ! Comment je fais moi, si je veux que le message soit affiché en permanence ?

Un système de cache est justement fait pour.
La requête ne s'effectue qu'une seule fois par minute et son contenu, lui, est affiché en permanence !

Au final, tout le monde est gagnant :

Donc il y a tout à gagner en intégrant des caches sur votre site ! ;)

Même si vous utilisez des jointures, certaines grosses jointures peuvent être lourdes pour le serveur MySQL, et nécessitent aussi un système de cache.
Ne vous dites donc pas que c'est parce que votre site utilise des jointures que le serveur MySQL ne souffre pas ;) .

Réalisation du script

Nous avons tout préparé comme il faut !

Nous avons créé notre fichier .cache et nous allons maintenant nous en servir par le biais de PHP ;) .

Nous allons donc commencer par vérifier l'ancienneté du fichier. Pour cela, nous allons utiliser la fonction filemtime(). C'est une fonction qui renvoie le timestamp de la date de dernière modification d'un fichier.

Nous allons ensuite, à partir du timestamp actuel (récupéré avec la fonction time()) et à partir de celui de la dernière modification du fichier cache, calculer le nombre de secondes écoulées depuis la dernière modification de notre fichier. Si ça fait 60 secondes ou plus, on mettra à jour le cache.

Pour cela, une simple soustraction suffit :

Code : PHP
1
2
// On soustrait du timestamp actuel celui de la dernière modification pour obtenir le nombre de secondes écoulées depuis la dernière modification
$modif_ago = time() - filemtime('cache/livre_or.cache');


Maintenant, nous allons vérifier si notre fichier est assez ancien.
Sachant que le timestamp est une valeur en secondes, nous allons vérifier si le fichier a été modifié il y a plus de 60 secondes :

Code : PHP
1
2
3
if($modif_ago > 60) { // SI le fichier a été modifié il y a plus d'une minute
     // ON MET LE FICHIER À JOUR \\
}


Nous n'avons pas besoin de else car nous n'avons rien à faire d'autre si le fichier est assez récent. ;)

Nous allons maintenant nous occuper de la mise à jour de notre fichier :) .
Pour cela, nous devons tout d'abord récupérer un message aléatoirement dans la base de données et exporter les données :

Code : PHP
1
2
$select_message_aleatoire = mysql_query('SELECT * FROM livre_or ORDER BY RAND() LIMIT 1'); // On sélectionne 1 message aléatoirement
$infos_message = mysql_fetch_array($select_message_aleatoire);


Dans ce code, les mots clés ORDER BY RAND() permettent d'organiser tous les messages aléatoirement, et le mot clé LIMIT 1 permet la sélection d'un seul message dans cette liste.

Étape suivante : nous devons rédiger un code qui met à jour le fichier.

Nous utiliserons fopen() avec l'option w+.
Cette option permet de réaliser plusieurs choses.
Nous allons aussi utiliser la fonction fwrite() qui écrit dans le fichier, et pour finir, fclose() qui ferme la "connexion" au fichier.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$select_message_aleatoire = mysql_query('SELECT * FROM livre_or ORDER BY RAND() LIMIT 1'); // On sélectionne 1 message aléatoirement
$infos_message = mysql_fetch_array($select_message_aleatoire);
 
// On fait un stripslashes sur toutes les entrées de l'array $infos_message ; la fonction array_map() permettant d'effectuer une fonction sur toutes les entrées d'un array. Ici, la fonction stripslashes() sera donc effectuée sur toutes les informations que l'on a récupérées avec la requête SQL
array_map('stripslashes', $infos_message);
// On fait notre code xHTML :
$xHTML = 'Par <strong>' . $infos_message['pseudo'] . '</strong> :<br />
&quot;<em>' . nl2br($infos_message['message']) . '</em>&quot;';
// On enregistre notre code dans le fichier :
        // On va commencer par ouvrir le fichier en w+
        $fichier = fopen('cache/livre_or.cache', 'w+');
        /* Rappel : l'option w+ ne nécessite pas le replacement du pointeur
        ni l'effacement du fichier. */
        
        // On écrit le code xHTML dans le fichier
        fwrite($fichier, $xHTML);
        
        // Pour finir, on coupe la communication avec le fichier
        fclose($fichier);


Votre code devrait maintenant ressembler à ceci :) :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// On soustrait du timestamp actuel celui de la dernière modification pour obtenir le nombre de secondes écoulées depuis la dernière modification
$modif_ago = time() - filemtime('cache/livre_or.cache');
 
if($modif_ago > 60) { 
 
$select_message_aleatoire = mysql_query('SELECT * FROM livre_or ORDER BY RAND() LIMIT 1'); // On sélectionne 1 message aléatoirement
$infos_message = mysql_fetch_array($select_message_aleatoire);
 
// SI le fichier a été modifié il y a plus d'une minute
        // On fait un stripslashes sur toutes les entrées de l'array $infos_message ; la fonction array_map() permettant d'effectuer une fonction sur toutes les entrées d'un array. Ici, la fonction stripslashes() sera donc effectuée sur toutes les informations que l'on a récupérées avec la requête SQL
        array_map('stripslashes', $infos_message);
        // On fait notre code xHTML :
        $xHTML = 'Par <strong>' . $infos_message['pseudo'] . '</strong> :<br />
        &quot;<em>' . nl2br($infos_message['message']) . '</em>&quot;';
        // On enregistre notre code dans le fichier :
                // On va commencer par ouvrir le fichier en w+
                $fichier = fopen('cache/livre_or.cache', 'w+');
                /* Rappel : l'option w+ ne nécessite pas le replacement du pointeur
                ni l'effacement du fichier. */
                
                // On écrit le code xHTML dans le fichier
                fwrite($fichier, $xHTML);
                
                // Pour finir, on coupe la communication avec le fichier
                fclose($fichier);
}


Afficher le contenu du fichier



Nous avons maintenant terminé le système de mise en cache ! :D

Il nous suffit juste d'afficher le fichier, qui est le message aléatoire "mis en cache". ;)
Et ceci s'effectue grâce à la fonction file_get_contents() :) :

Code : PHP
1
2
3
4
// On récupère le contenu de notre fichier
$message_aleatoire = file_get_contents('cache/livre_or.cache');
// On l'affiche
echo $message_aleatoire;


Et voilà ! :D
Votre code est entièrement fini !
Voici à quoi devrait ressembler votre code à présent :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// // On soustrait du timestamp actuel celui de la dernière modification pour obtenir le nombre de secondes écoulées depuis la dernière modification
$modif_ago = time() - filemtime('cache/livre_or.cache');
 
if($modif_ago > 60) { // SI le fichier a été modifié il y a plus d'une minute
 
$select_message_aleatoire = mysql_query('SELECT * FROM livre_or ORDER BY RAND() LIMIT 1'); // On sélectionne 1 message aléatoirement
$infos_message = mysql_fetch_array($select_message_aleatoire);
 
        // On fait un stripslashes sur toutes les entrées de l'array $infos_message ; la fonction array_map() permettant d'effectuer une fonction sur toutes les entrées d'un array. Ici, la fonction stripslashes() sera donc effectuée sur toutes les informations que l'on a récupérées avec la requête SQL
        array_map('stripslashes', $infos_message);
        // On fait notre code xHTML :
        $xHTML = 'Par <strong>' . $infos_message['pseudo'] . '</strong> :<br />
        &quot;<em>' . nl2br($infos_message['message']) . '</em>&quot;';
        // On enregistre notre code dans le fichier :
                // On va commencer par ouvrir le fichier en w+
                $fichier = fopen('cache/livre_or.cache', 'w+');
                /* Rappel : l'option w+ ne nécessite pas le replacement du pointeur
                ni l'effacement du fichier. */
                
                // On écrit le code xHTML dans le fichier
                fwrite($fichier, $xHTML);
                
                // Pour finir, on coupe la communication avec le fichier
                fclose($fichier);
}
 
// On récupère le contenu de notre fichier
$message_aleatoire = file_get_contents('cache/livre_or.cache');
// On l'affiche
echo $message_aleatoire;


Ce qu'il se passera est simple.

Le livre d'or est un exemple, mais sachez que vous pouvez aussi écrire du code PHP dans un fichier en .php par exemple :) (ce sera tout de même un système de cache).

Enfin, pour ceux qui se poseraient cette question :

Pourquoi faire tout ce code alors qu'une requête seule est plus rapide ?

Je vous dirais :
Non, non et non ! :p

En effet, le fait de passer par les fichiers est plus rapide pour PHP que de communiquer avec le serveur MySQL. Notamment en cas de grosses requêtes qui sont assez "longues" à exécuter. ;)

Si vous n'avez pas un site très fréquenté, il est clair qu'un tel système pour la sélection d'un message au hasard dans le livre d'or ne vous servira pratiquement à rien (juste à savoir faire marcher un système de cache, ce qui n'est pas inutile pour l'avenir ;) ). Si par contre, votre site reçoit beaucoup de visiteurs, la moindre requête économisée peut-être bénéfique ;) .

Q.C.M.

À quoi sert un système de cache ?
Quelle option permet d'écrire dans un fichier, que le fichier puisse se créer tout seul en cas d'absence de celui-ci et enfin, de s'auto-vider ?
Que va faire ce code ?

Code : PHP
1
2
3
4
5
6
// On ouvre le fichier
fopen('monfichier.txt', 'w+');
// On écrit dans le fichier
fwrite($monfichier, 'Hello world !');
// On ferme le fichier
fclose($monfichier);


Vous venez de créer un système de cache ! :D

Cette méthode est assez simple, vous avez dû le remarquer ;) . Il se peut que plus tard vous conceviez un système plus poussé, et donc, normalement, plus performant.

Faites-en bon usage :D .

Et en cas de problème, envoyez-moi un MP, ou mieux : contactez-moi par MSN. ;)
Auteur : Kermi
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 91 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.093s (0.0817s)