| |
|
Voir le sujet précédent :: Voir le sujet suivant
|
| Auteur |
Message |
| |
|
fandecine Modérateur

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 16:26 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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! )
- 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: |
[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.
Dernière édition par fandecine le Mer Mai 18, 2005 16:01; édité 3 fois |
|
| |
|
 |
Phix WRInaute impliqué

Inscrit le: 15 Juin 2004 Messages: 418 Localisation: Lyon & Savoie
|
Posté le : Mar Mai 17, 2005 16:34 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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:
| Code: |
| 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

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 16:42 Sujet du message: [script] Mise en cache des pages PHP |
|
|
c'est ça!  |
|
| |
|
 |
Phix WRInaute impliqué

Inscrit le: 15 Juin 2004 Messages: 418 Localisation: Lyon & Savoie
|
Posté le : Mar Mai 17, 2005 16:51 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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: |
| 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

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 16:55 Sujet du message: [script] Mise en cache des pages PHP |
|
|
| 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é

Inscrit le: 21 Juil 2003 Messages: 872
|
Posté le : Mar Mai 17, 2005 17:09 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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 |
|
| |
|
 |
spout WRInaute passionné

Inscrit le: 14 Mai 2003 Messages: 569 Localisation: Manhay (Belgique)
|
Posté le : Mar Mai 17, 2005 17:12 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 17:28 Sujet du message: [script] Mise en cache des pages PHP |
|
|
| 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. |
|
| |
|
 |
JeunZ WRInaute accro

Inscrit le: 18 Fév 2004 Messages: 5306
|
Posté le : Mar Mai 17, 2005 17:54 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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 WRInaute accro

Inscrit le: 07 Juil 2004 Messages: 10785 Localisation: -------------- Ancien retraité du forum ! -------------------------- :)
|
Posté le : Mar Mai 17, 2005 17:56 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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  |
|
| |
|
 |
JeunZ WRInaute accro

Inscrit le: 18 Fév 2004 Messages: 5306
|
Posté le : Mar Mai 17, 2005 18:16 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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é

Inscrit le: 14 Mai 2003 Messages: 569 Localisation: Manhay (Belgique)
|
Posté le : Mar Mai 17, 2005 18:20 Sujet du message: [script] Mise en cache des pages PHP |
|
|
Pour la suppression du cache:
La solution que l'on pense de suite:
| Code: |
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: |
exec("find /home/user/public_html/cache/ | xargs rm");
|
|
|
| |
|
 |
fandecine Modérateur

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 18:34 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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:
| Code: |
<?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

Inscrit le: 18 Fév 2004 Messages: 5306
|
Posté le : Mar Mai 17, 2005 18:39 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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

Inscrit le: 02 Avr 2005 Messages: 1393 Localisation: Béarn
|
Posté le : Mar Mai 17, 2005 18:59 Sujet du message: [script] Mise en cache des pages PHP |
|
|
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  |
|
| |
|
 |
| |
|
|
|
|
Autres sujets de discussion :
Définitions :
|
|