Lorsqu'on doit lister des éléments provenant d'une base de données avec énormément de liaisons dans la requête, le traitement prend quelques secondes et le serveur en prend un coup à chaque affichage de page.
Pour palier à ça, il faut mettre en place un système de cache des pages de listing.
Un système de cache consiste en l'enregistrement de la page une fois totalement traitée (donc ce qu'on affiche, le code HTML final) puis à le ressortir lors de l'appel suivant de la même page. Bien sûr, dans tout bon système de cache, on peut spécifier la durée de vie de ce cache (1 heure par exemple) pour qu'il soit effacé au delà et remplacé par un nouveau.
Avec ceci, on gagne donc en ressource serveur (beaucoup moins de connexions vers le serveur MySQL) mais les pages affichées ne sont pas synchronisées à l'instant T, on a 1 heure maximum de décalage. Même si ce n'est pas énorme, ce peut être handicapant dans certains cas, il faut le garder à l'esprit.
Pour un site que j'ai mis en ligne samedi dernier, qui utilise jusqu'à 11 tables dans ses listings, j'ai dû mettre en place un tel système pour gagner en temps d'affichage. L'avantage est que les listings changent une ou deux fois par jour au grand maximum, pas du tout pour la plupart. Le temps du cache est donc pour l'instant d'une heure, mais il est possible que je le monte à 2 voir 3 heures.
Pour mettre en place un tel système, j'ai regardé s'il n'existait pas un bout de code ou une classe sous licence GPL prête à l'emploi. Après quelques googlisations, j'ai trouvé mon bonheur.
Un petit tour dans le code pour changer le dossier d'enregistrement du cache afin de le rendre inaccessible depuis le site, et pour voir comment il générait ses noms de cache.
Il utilise simplement l'URL de la page demandée, y ajoute tous les paramètres donnés en GET et en fait le MD5 (pour avoir toujours la même longueur de nom fichier et pas de problèmes avec des caractères spéciaux) et y donne l'extension .cache.
Le gros plus de cette classe, c'est qu'elle permet de mettre en cache la page PHP zone par zone. On peut ainsi imaginer une page avec une partie sans cache (le menu avec les infos de connexion par exemple), une partie avec un cache d'une heure (un listing qui change assez souvent) et une partie avec un cache d'une journée (un classement journalier par exemple).
De plus, si vous voulez forcer la reconstruction du cache, il suffit de mettre le paramètre rebuild en GET dans l'URL de la page.
Une classe à ajouter à votre librairie de toute urgence ! (et le site dans vos favoris...)
Modification de décembre 2010
Comme le fichier n'est plus accessible depuis le lien donné plus haut, voici le fichier que j'avais gardé dans mes archives.
Commentaires.
#1 par rocawear
j'aime bien la classe sauf le fait qu'elle utilise le cache du navigateur,
je n'aime le fait de devoir vider le cache du navigateur afin de voir les nouvelle donner :s
le Dimanche 30 Mars 2008 à 07:46:56
#2 par Nyro
Cette classe ne permet pas de mettre en cache les données sur le navigateur, mais le fait du côté du serveur.
Autrement dit, le résultat final de la page générée est stockée dans des fichier .cache sur le serveur, et directement récupérer si elles sont considéré comme étant encore valable.
Si les données sont récupérées, tout le processus qui a été effectué pour créer cette partie sera ignorée et fera donc des économies de requêtes et mémoire pour le serveur.
Pour utiliser le cache du navigateur il faut envoyer des éléments dans les entêtes HTTP de la réponse comme Pragma, Expires, et autres...
le Dimanche 30 Mars 2008 à 08:05:57
#3 par rocawear
J'ai mal exprimer ce que je voulais dire ˆˆ
La classe fonctionne très bien mais le seul default que je lui trouve est qu'elle utilise le cache navigateur et stockage sur le serveur.
donc si le temps de mise en cache ( 1 heure ) est expirer, et que l'on revient sur la page, le navigateur va nous montrer la version en cache du navigateur.
alors cela nous force a faire CTRL + F5 afin de vider le cache navigateur pour voir la réel page.
le Dimanche 30 Mars 2008 à 10:08:14
#4 par Nyro
Dans ce cas, il faut rajouter dans le entêtes HTTP pour interdire le cache.
Je n'ai pas tester, mais cela devrait ressembler à :
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Thu, 19 Nov 1981 08:52:00 GMT'); // une date dans le passé
header('Pragma: no-cache');
De cette façon, le navigateur ne devrait pas mettre en cache la page et télécharger la page à chaque affichage, quoi qu'il arrive
le Dimanche 30 Mars 2008 à 19:54:32
#5 par rocawear
Je vais tester et je te redonne des nouvelle.
Merci !
( ps: j'ai fait une classe pour une gestion d'un cache hier ˆˆ )
Cordialement - Rocawear
le Lundi 31 Mars 2008 à 15:35:50
#6 par lorenzo
bonjour,
je découvre le billet, et le lien est périmé.
cette classe m'intéresse fortement, pouvez vous me donner son nom et où la downloader ?
le Mardi 21 Décembre 2010 à 15:44:50
#7 par nyro
@lorenzo : Tu as de la chance, j'avais garder ce fichier dans mes archives ! J'ai éditer le pots pour y ajouter un lien vers le zip avec cette classe dedas.
le Jeudi 23 Décembre 2010 à 18:05:34
#8 par algerie
Bonjour,
j'aimerai installer un systeme de cache comme celui la sur un de mes sites, plus précisément pour mettre en cache les résultats de recherches, et sincerement j'ai pas trouvé par ou commencer, j'ai mon fichiers search.php et j'ai déjà télécharger le fichier class.cache.php,pourriez vous m'expliquer comment mettre en place ce systeme de cache,ou du moins juste m'orienter.
Merci d'avance.
le Vendredi 18 Mars 2011 à 23:17:47
Ajouter un commentaire.