[script] Mise en cache des pages PHP
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
[script] Mise en cache des pages PHP
- suite à une discussion animée d'hier soir sur le forum Webrankinfo ou il était question de partage de connaissances, de pédagogie, d'aciens et de nouveaux wrinautes (j'espère quen tant que nouveau, j'apprendrais quelque chose aux anciens pour pas qu'ils se barrent!
- parce que 'j'ai vu plusieurs fils ou les webmasters s'interrogent sur le passage du mutualiser au dédié (l'astuce que je donne ici permet de soulager énormément le serveur)
Si le truc que je vous communique est déjà archi connu, vous avez le droit de m'insulter!
Voila, sur tous mes sites et ceux de mes clients, j'utilise une mise en cache des pages PHP sous forme de page HTML (non, ce n'est pas pareil que générer un site en HTML statique à partir d'un site dynamique!).
Je vous donne le code plus bas.
Pourquois procéder de la sorte? tout simplement pour limiter le nombre de requetes mysql (grosses consommatrices de ressources CPU). Pour ceux qui ont du mal à comprendre, cela permet d'eviter le 'too many connection'. Bon si vous êtes sur un mutualisé, ça ne peut être efficace que si tout le monde fait de même. Par contre, sur mes serveurs dédiés, à serveur et traffic équivalent, je double le nombre de sites hébergés!
- Code: Tout sélectionner
[i]ici code php que vous ne voulez pas mettre en cache[/i]
<?PHP
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
?>
[i]Votre page PHP ici[/i]
<?php
$contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
ob_end_flush();// on termine la bufferisation
$fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
if ($fd) {
fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
fclose($fd);
}
} else { // le fichier cache existe déjà
include ($fichierCache); // on le copie ici
}
?>
Que fait ce script:
1/ il recupere l'url de la page
2/ transforme cet url en un nom de fichier sans /
3/ teste l'existance de ce fichier dans le répertoire /cache/
4/ si le fichier n'existe pas, génére la page, puis la stoque dans le repertoire cache
/5 si le fichier existe, l'ouvre en tant que page html
La page html est générée lors de la premiere requete. Avce ce système, il faut gerer le cache lors des mises à jour (effacer la page du cache correspondante).
Je gere un site de + de 80 000 pages avec ce système sans problème notoire!
Voila!
si vous êtes sages et que ce fil a du succé, je vous filerez une autre astuce de temps en temps.
- Code: Tout sélectionner
Dernière édition par fandecine le Mer Mai 18, 2005 15:01, édité 3 fois.
Merci pour ce code! Même si je n'ai pas encore de problèmes au niveau des performances de mon hébergement, j'essaierai de mettre en place ce système, mieux vaut prévenir que guérir
Si j'ai bien compris, tu te sers de cette ligne:
pour spécifier la durée d'expiration d'un fichier cache, et si je sais bien calculer, là il est spécifié que si le fichier a moins d'un an d'existence, on ne le rafraîchit pas. C'est bien ca?
Si j'ai bien compris, tu te sers de cette ligne:
- Code: Tout sélectionner
if (@filemtime($fichierCache)<time()-(3600*24*360))
pour spécifier la durée d'expiration d'un fichier cache, et si je sais bien calculer, là il est spécifié que si le fichier a moins d'un an d'existence, on ne le rafraîchit pas. C'est bien ca?
Il y a même possibilité d'améliorer ton script: dans spip (qui propose aussi un système de cache), chaque page peut être rechargée grâce à un paramètre GET recalcul, il suffirait de faire:
pour ne pas avoir à se connecter en ftp et supprimer le fichier pour faire une mise à jour... on aurait qu'à appeller la page avec ce paramètre recalcul.
- Code: Tout sélectionner
if (@filemtime($fichierCache)<time()-(3600*24*360) || isset($_GET['recalcul']))
pour ne pas avoir à se connecter en ftp et supprimer le fichier pour faire une mise à jour... on aurait qu'à appeller la page avec ce paramètre recalcul.
merci fandecine c'est énorme, ça fait un moment que je voulais m'y mettre.
par contre pour faire la casse pieds, tu pourrais pas mettre en anotation le rôle de chaque ligne avec des "//" comme ça ce serait plus facile à comprendre.
à partir de "ob_start(); " je suis complètement perdue
merci
carole
par contre pour faire la casse pieds, tu pourrais pas mettre en anotation le rôle de chaque ligne avec des "//" comme ça ce serait plus facile à comprendre.
à partir de "ob_start(); " je suis complètement perdue
merci
carole
Salut,
Moi aussi j'utilise du cache HTML, il n'y a rien de tel
Mais avec des templates à la "Smarty" sauf que c'est du PHP PUR !
Pas besoin de réinventer la roue, PHP est parfait pr les templates
Je ne coupe plus la page en header/footer comme l'on ferais avec des pseudo templates PHP, c'est bcp plus simple à modifier le "layout".
Le tuto sur lequel je me suis basé:
http://www.massassi.com/php/articles/template_engines/
Je ne remercierais jamais assez Brian Lozier d'avoir montré cette superbe alternative à Smarty... j'étais parti pour utiliser Smarty puis je suis tombé là dessus...
Moi aussi j'utilise du cache HTML, il n'y a rien de tel
Mais avec des templates à la "Smarty" sauf que c'est du PHP PUR !
Pas besoin de réinventer la roue, PHP est parfait pr les templates
Je ne coupe plus la page en header/footer comme l'on ferais avec des pseudo templates PHP, c'est bcp plus simple à modifier le "layout".
Le tuto sur lequel je me suis basé:
http://www.massassi.com/php/articles/template_engines/
Je ne remercierais jamais assez Brian Lozier d'avoir montré cette superbe alternative à Smarty... j'étais parti pour utiliser Smarty puis je suis tombé là dessus...
caro a écrit:par contre pour faire la casse pieds, tu pourrais pas mettre en anotation le rôle de chaque ligne avec des "//" comme ça ce serait plus facile à comprendre.
meuh non! t'es pas casse pieds carole!
je t'ai rajouté tout plein de commentaires.
fandecine l'astuce est très interessante et j'imagine que ohax va débarquer pour en donner son opinion
sinon les pavés je suis pas trop fans mais c'est très gentil de mettre cette formule que jai lu directement et que j'apprécie beaucoup
sinon les pavés je suis pas trop fans mais c'est très gentil de mettre cette formule que jai lu directement et que j'apprécie beaucoup
Il manque la supression du cache...
En fait il faudrait expliquer comment supprimer les fichiers si on modifie la page plutot que d'attendre la fin du temps de cache ça permettrai de l'appliquer à un forum par exemple, ou à un blog
En fait il faudrait expliquer comment supprimer les fichiers si on modifie la page plutot que d'attendre la fin du temps de cache ça permettrai de l'appliquer à un forum par exemple, ou à un blog
Pour la suppression du cache:
La solution que l'on pense de suite:
Mais lorsque l'on se retrouve avec beaucoup de fichiers dans un répertoire, il y'a une limitation quelque part dans le kernel linux pour le nombre de fichiers, alors la commande ci-dessus ne fonctionneras plus.
La solution ultime:
La solution que l'on pense de suite:
- Code: Tout sélectionner
exec("rm -f /home/user/public_html/cache/*");
Mais lorsque l'on se retrouve avec beaucoup de fichiers dans un répertoire, il y'a une limitation quelque part dans le kernel linux pour le nombre de fichiers, alors la commande ci-dessus ne fonctionneras plus.
La solution ultime:
- Code: Tout sélectionner
exec("find /home/user/public_html/cache/ | xargs rm");
hola! j'avais dit une astuce à la fois!
bon, prenons un cas concret. Sur le site de mon profil, je vais, cette nuit
, malgrés la fatigue metre à jour la page des sorties en salles (mais aussi des sorties de la semaine prochaine, ajouter des films, des affiches etc...). J'efface le cache en FTP avec une routine du style de celle-ci:
N.B: Le ficheir cache est crée par un script PHP, donc avec les attributs groupe et owner egale à PHP. Le fichier cache est supprimé en FTP donc avec l'attribut loginftp! c'est pour cela qu'il faut d'abord changer les droits du fichier à effacer en 0777 pour pouvoir l'effacer.
Voila, c'est un script trés parcellaire car il est trop dépendant de la structure du site, mais couplé à une BDD et une requete mysql c'est trés puissant!
bon, prenons un cas concret. Sur le site de mon profil, je vais, cette nuit
- Code: Tout sélectionner
<?php
$conn_id = ftp_connect("ftp.monsite.com");
$login_result = ftp_login($conn_id, "loginftp", "passwordftp"); //connection ftp
@ftp_site ($conn_id, "CHMOD 777 chemin_vers_le_fichier_a_effacer"); // on change les droit sur le fichier pour pouvoir l'effacer
@ftp_delete ($conn_id, "chemin_vers_le_fichier_a_effacer
"); // on efface le fichier
//si plusieurs fichiers à effacer
foreach (glob("chemin_vers_les_fichiers_a_effacer-*.html") as $filename) { // liste des fichiers correpondants au masque
@ftp_site ($conn_id, "CHMOD 777 ".$filename);
@ftp_delete ($conn_id, $filename);
}
ftp_quit($conn_id);
?>
N.B: Le ficheir cache est crée par un script PHP, donc avec les attributs groupe et owner egale à PHP. Le fichier cache est supprimé en FTP donc avec l'attribut loginftp! c'est pour cela qu'il faut d'abord changer les droits du fichier à effacer en 0777 pour pouvoir l'effacer.
Voila, c'est un script trés parcellaire car il est trop dépendant de la structure du site, mais couplé à une BDD et une requete mysql c'est trés puissant!
en fait j'ai mis un an pour etre sur que le fichier ne soit pas regénéré avant un moment, mais je suis actuellement en train de valider ma BDD enregistrement par enregistrement et dans l'avenir, je donnerais une durée de vie infinie aux fichier cache valides (aucune raison de les générer à nouveau).
Un enregistrement (par exemple un film) est validé lorsque j'ai toutes les infos (casting, synopsis, durée etc...) et toutes les ressources annexes (wallpapers, bande annonce, jaquettes...) A ce moment là, la fiche n'étant plus mise à jour, aucune raison d'effacer le cache.
Par contre, lorsque je modifie le code des pages, je renome le répertoire cache (en connexion SSH) puis j'en recré un vide et hop, ça reppart.
PS: si vous avez des questions, faudrat attendre demain car j'ai un RDV... a demain
Un enregistrement (par exemple un film) est validé lorsque j'ai toutes les infos (casting, synopsis, durée etc...) et toutes les ressources annexes (wallpapers, bande annonce, jaquettes...) A ce moment là, la fiche n'étant plus mise à jour, aucune raison d'effacer le cache.
Par contre, lorsque je modifie le code des pages, je renome le répertoire cache (en connexion SSH) puis j'en recré un vide et hop, ça reppart.
PS: si vous avez des questions, faudrat attendre demain car j'ai un RDV... a demain
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Les albums web Picasa passent à 1 Go de stockage
- Le cache de Google : description, explications
- Photos satellite des incendies en Grèce dans Google Earth
- Ajouter un Gadget Google sur son site
- L'algorithme de Google en résumé (mars 2003)
- Google Desktop pour Mac OS X
- Picasa Web Albums en français
- Google Pack s'enrichit de 2 nouveaux logiciels gratuits
- Résultats des élections présidentielles du 1er tour 2007
- AdSense Tracking : statistiques détaillées sur les clics AdSense
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités











le forum