[tutoriel] Mise en cache en PHP, la version complète.
13 messages
• Page 1 sur 1
Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics
- lyonist
- WRInaute discret

- Messages: 220
- Inscription: 5 Aoû 2008
[tutoriel] Mise en cache en PHP, la version complète.
Bonjour,
fandecine a fait un superbe script de mise en cache en PHP il est accesible sur cette page :
http://forum.webrankinfo.com/mise-cache-des-pages-php-t28614.html
Son script fonctionne très bien mais que pour les petits/moyens sites, s'il y a plusque 1 million fichiers cache ça va provoquer les performance du serveur.
j'ai ajouté des petits trucs pour l'améliorer pour qu'il supporte 600 millions fichiers cache facilement.
voici le script final :
Le principe est simple, c'est de convertir chaque "page actuelle" en MD5, et de créer un dossier des 3 première caractères, et après on compare, si le 3 premières caractères du MD5 de notre page correspond à un dossier on met dedans.. donc on aura en total 15 x 15 x 15 (15 puissance 3 correspond à l'hexa (15) X 3 caractères) dossiers cache, ce qui fait 3375 dossiers.
donc pour 2 millions pages on aura seulement 592 fichiers par dossier
Voilà, je l'ai fais par besoin, mon serveur rame à cause de quelque millions fichiers cache, je me suis dis ça peut être utile pour quelques membres sur WRI.
fandecine a fait un superbe script de mise en cache en PHP il est accesible sur cette page :
http://forum.webrankinfo.com/mise-cache-des-pages-php-t28614.html
Son script fonctionne très bien mais que pour les petits/moyens sites, s'il y a plusque 1 million fichiers cache ça va provoquer les performance du serveur.
j'ai ajouté des petits trucs pour l'améliorer pour qu'il supporte 600 millions fichiers cache facilement.
voici le script final :
- Code: Tout sélectionner
<?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
if(!is_dir("cache/".substr(md5($_SERVER['REQUEST_URI']), -3))) { mkdir("cache/".substr(md5($_SERVER['REQUEST_URI']), -3)); }
$fichierCache="cache/".substr(md5($urldemandee), -3)."/".$urldemandee.".html"; // 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
echo "Votre contenu à mettre en cache ici";
$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
}
?>
Le principe est simple, c'est de convertir chaque "page actuelle" en MD5, et de créer un dossier des 3 première caractères, et après on compare, si le 3 premières caractères du MD5 de notre page correspond à un dossier on met dedans.. donc on aura en total 15 x 15 x 15 (15 puissance 3 correspond à l'hexa (15) X 3 caractères) dossiers cache, ce qui fait 3375 dossiers.
donc pour 2 millions pages on aura seulement 592 fichiers par dossier
Voilà, je l'ai fais par besoin, mon serveur rame à cause de quelque millions fichiers cache, je me suis dis ça peut être utile pour quelques membres sur WRI.
-

nickargall - WRInaute accro

- Messages: 6468
- Inscription: 13 Juin 2005
Re: [tutoriel] Mise en cache en PHP, la version complète.
C'est vraiment pas bête 
-

VisitezMonSite - WRInaute passionné

- Messages: 1147
- Inscription: 7 Mai 2009
Re: [tutoriel] Mise en cache en PHP, la version complète.
C'est vraiment sympa de partager tes modifs!
- petit-ourson
- WRInaute impliqué

- Messages: 855
- Inscription: 31 Mai 2004
Re: [tutoriel] Mise en cache en PHP, la version complète.
Une chaine a toujours le même md5, mais es-tu sûr que la valeur d'un md5 représente toujours la même chaine ?
-

VisitezMonSite - WRInaute passionné

- Messages: 1147
- Inscription: 7 Mai 2009
Re: [tutoriel] Mise en cache en PHP, la version complète.
Petit-ourson je ne vois pas la pertinence de ta question par rapport au sujet, puisqu'un md5 est toujours le même pour une chaine donnée, et que lyonist se sert des 3 premiers charactères du md5 du nom de la page demandé pour créer/classer dans un dossier, mais que le nom du fichier cache reste "en clair" il n'y a pas de problème. Tu n'as pas dû bien lire le premier post ou alors j'ai loupé quelque chose?
- Code: Tout sélectionner
$fichierCache="cache/".substr(md5($urldemandee), -3)."/".$urldemandee.".html"; // on construit le chemin du fichier cache de la page
- petit-ourson
- WRInaute impliqué

- Messages: 855
- Inscription: 31 Mai 2004
Re: [tutoriel] Mise en cache en PHP, la version complète.
Effectivement j'avais lu un peu trop rapidement le premier message.
-

WebRankInfo - Administrateur du site

- Messages: 19415
- Inscription: 19 Avr 2002
Re: [tutoriel] Mise en cache en PHP, la version complète.
Merci pour ce partage d'infos et de code. Pour ma part le nom du fichier de cache est quasi toujours associé à un ID (nombre), par exemple pour un topic du forum ce sera l'ID du topic. Donc c'est simple de répartir les fichiers dans des sous-répertoires basés sur les chiffres.
J'ai testé jusqu'à 100.000 fichiers par répertoire sans voir de baisse sensible des perfs (serveur apache, je ne me prononce pas pour IIS
)
J'ai testé jusqu'à 100.000 fichiers par répertoire sans voir de baisse sensible des perfs (serveur apache, je ne me prononce pas pour IIS
-

fandecine - Modérateur

- Messages: 2047
- Inscription: 2 Avr 2005
Re: [tutoriel] Mise en cache en PHP, la version complète.
Aurais-je un fils ... spiryuel !?
Merci lyonist pour ces modifs trés pertinantes
Olivier, si le nombre de fichiers dans un répertoire doit poser des problèmes c'est au niveau du SE (Linux par exemple) pas au niveau d'apache
Je ne suis pas allé jusqu'à 100.000 fichiers dans un répertoire, mais le nombre n'influe pas sur le temps d'accés en adressage direct à un fichier (sauf avec une recherche). Par contre cela peut poser des problémes au niveau de l'optimisation de l'occupation de l'espace disque (avec un système de fichier EXT3 généralement utilisé sous linux) surtout pour un systéme de cache qui par définition effec et recré des fichiers (le disque peut vite resembler à un morceau de gruyère). C'est plus à ce niveau que le morcellement en répertoire est intéressant.
Maintenant, en matière de cache, je n'utilise plus ce systéme qui consomme beaucoup d'espace disque innutile et ne permet pas de modifier l'apparence des pages sans éffacer le cache. Il est bien plus efficace de sérialiser les données dynamique (de façon indépendante de l'habillage des données) et de stocker sur le disque la chaine sérialisée. Cela permet en plus de pouvoir utiliser ces données sur des pages différentes et diminue énormément la redondance.
Je crois me rappeller que j'avais promis de publier une classe PHP qui fait ce boulot, mais par manque de temps libre
Je vais m'y remettre
Merci lyonist pour ces modifs trés pertinantes
Olivier, si le nombre de fichiers dans un répertoire doit poser des problèmes c'est au niveau du SE (Linux par exemple) pas au niveau d'apache
Je ne suis pas allé jusqu'à 100.000 fichiers dans un répertoire, mais le nombre n'influe pas sur le temps d'accés en adressage direct à un fichier (sauf avec une recherche). Par contre cela peut poser des problémes au niveau de l'optimisation de l'occupation de l'espace disque (avec un système de fichier EXT3 généralement utilisé sous linux) surtout pour un systéme de cache qui par définition effec et recré des fichiers (le disque peut vite resembler à un morceau de gruyère). C'est plus à ce niveau que le morcellement en répertoire est intéressant.
Maintenant, en matière de cache, je n'utilise plus ce systéme qui consomme beaucoup d'espace disque innutile et ne permet pas de modifier l'apparence des pages sans éffacer le cache. Il est bien plus efficace de sérialiser les données dynamique (de façon indépendante de l'habillage des données) et de stocker sur le disque la chaine sérialisée. Cela permet en plus de pouvoir utiliser ces données sur des pages différentes et diminue énormément la redondance.
Je crois me rappeller que j'avais promis de publier une classe PHP qui fait ce boulot, mais par manque de temps libre
Je vais m'y remettre
-

phpmikedu83 - WRInaute passionné

- Messages: 1281
- Inscription: 6 Aoû 2005
Re: [tutoriel] Mise en cache en PHP, la version complète.
En utilisant des preg_replace déjà, ça sera plus performant... 
-

bruno212 - WRInaute occasionnel

- Messages: 497
- Inscription: 13 Fév 2005
Re: [tutoriel] Mise en cache en PHP, la version complète.
Bonsoir,
On peut aussi utiliser la librairie CacheLite, disponible sur Pear
http://pear.php.net/package/Cache_Lite
Cette librairie permet de mettre en cache le résultat d'une fonction php, par exemple, une fonction qui génère un menu. Ainsi celui-ci ne sera calculé qu'une seule fois.
De plus, on peut définir la durée de validité du cache.
Les fichiers plus vieux que le temps de cache spécifié ne sont plus utilisés et un autre fichier est calculé.
à plus
On peut aussi utiliser la librairie CacheLite, disponible sur Pear
http://pear.php.net/package/Cache_Lite
Cette librairie permet de mettre en cache le résultat d'une fonction php, par exemple, une fonction qui génère un menu. Ainsi celui-ci ne sera calculé qu'une seule fois.
De plus, on peut définir la durée de validité du cache.
Les fichiers plus vieux que le temps de cache spécifié ne sont plus utilisés et un autre fichier est calculé.
à plus
-

VisitezMonSite - WRInaute passionné

- Messages: 1147
- Inscription: 7 Mai 2009
Re: [tutoriel] Mise en cache en PHP, la version complète.
@fandecine: as-tu eu le temps de faire ta classe PHP pour la fonction cache (avec la modif des sous dossiers donnée par lyonist ca serait encore mieux) ?
Ou un str_replace c'est encore plus rapide
phpmikedu83 a écrit:En utilisant des preg_replace déjà, ça sera plus performant...
Ou un str_replace c'est encore plus rapide
13 messages
• Page 1 sur 1
Formation recommandée sur ce thème :
Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Problème de mise en cache de pages PHP
- [script] Mise en cache des pages PHP - V2
- [script] Mise en cache des pages PHP
- Mise en cache PHP et librairie GD, est ce correct svp ?
- Utilisation intensive de la mise en cache des pages PHP.
- Mise en cache des pages php : mon alternative hérétique !
- Page en cache de Google pas complète !!!!!
- [Mise en cache] cryptage page html en cache
- [résolu] php mysql tutoriel
- Tutoriel fichier wp-config.php de Wordpress
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

