[script] Mise en cache des pages PHP

 

fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

[script] Mise en cache des pages PHP

Message le Mar Mai 17, 2005 16:26

:P voila, j'ouvre ce nouveau fil pour plusieurs raison:

- 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! :wink: )
- 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. :idea:

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 16:01, édité 3 fois.

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


Phix
WRInaute impliqué
WRInaute impliqué
 
Messages: 418
Inscription: Mar Juin 15, 2004 23:05

Message le Mar Mai 17, 2005 16:34

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 :wink:
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?


fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

Message le Mar Mai 17, 2005 16:42

c'est ça! :D


Phix
WRInaute impliqué
WRInaute impliqué
 
Messages: 418
Inscription: Mar Juin 15, 2004 23:05

Message le Mar Mai 17, 2005 16:51

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:
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.


fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

Message le Mar Mai 17, 2005 16:55

j'y avais pensé, mais quand je fais des mises à jour, ça concernne parfois des centaines de pages et là le ftp est imbatable!

caro
WRInaute passionné
WRInaute passionné
 
Messages: 871
Inscription: Lun Juil 21, 2003 19:13

Message le Mar Mai 17, 2005 17:09

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 :oops:

merci
carole


spout
WRInaute passionné
WRInaute passionné
 
Messages: 941
Inscription: Mer Mai 14, 2003 12:05

Message le Mar Mai 17, 2005 17:12

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...


fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

Message le Mar Mai 17, 2005 17:28

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! :D

je t'ai rajouté tout plein de commentaires.


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 13:41

Message le Mar Mai 17, 2005 17:54

Exactement se que je suis en train de mettre en place depuis trois jours sur mes sites ;-)

C'est génial :-)

Et avec un dédié on peut en plus coupler ça avec d'autres caches (sql, php accelerator)


Madrileño
Madrileño
Madrileño
 
Messages: 19427
Inscription: Mer Juil 07, 2004 13:14

Message le Mar Mai 17, 2005 17:56

fandecine l'astuce est très interessante et j'imagine que ohax va débarquer pour en donner son opinion :lol:
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 ;)


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 13:41

Message le Mar Mai 17, 2005 18:16

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 ;-)


spout
WRInaute passionné
WRInaute passionné
 
Messages: 941
Inscription: Mer Mai 14, 2003 12:05

Message le Mar Mai 17, 2005 18:20

Pour la suppression du cache:
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");


fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

Message le Mar Mai 17, 2005 18:34

hola! j'avais dit une astuce à la fois! :wink:

bon, prenons un cas concret. Sur le site de mon profil, je vais, cette nuit :cry: , 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:

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!


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 13:41

Message le Mar Mai 17, 2005 18:39

Et je crois que tu as oublié de préciser que c'est un cache d'un an non?

3600*24*360


fandecine
Modérateur
Modérateur
 
Messages: 1583
Inscription: Sam Avr 02, 2005 15:58

Message le Mar Mai 17, 2005 18:59

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 :D

 
Page suivante

Modérateurs: WebRankInfo, e-kiwi, OTP, fandecine, Patrice A.

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 :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités