[tutoriel] Mise en cache en PHP, la version complète.

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

lyonist
WRInaute discret
WRInaute discret
 
Messages: 220
Inscription: 5 Aoû 2008

[tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 11:01

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 :

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&eacute;
   ob_start(); // on d&eacute;marre la bufferisation de la page: rien de ce qui suit n'est envoy&eacute; 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&eacute;j&agrave;
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 :D

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
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 15:01

C'est vraiment pas bête :)


VisitezMonSite
WRInaute passionné
WRInaute passionné
 
Messages: 1147
Inscription: 7 Mai 2009

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 15:11

C'est vraiment sympa de partager tes modifs!


fabor
WRInaute discret
WRInaute discret
 
Messages: 152
Inscription: 17 Mar 2005

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 15:36

la différence de temps est très significative?

lyonist
WRInaute discret
WRInaute discret
 
Messages: 220
Inscription: 5 Aoû 2008

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 15:53

fabor a écrit:la différence de temps est très significative?


temps de réponse ? ben oui, ce n'est pas comme on cherche dans 6 millions fichiers comme 5000 fichiers ou moins.

petit-ourson
WRInaute impliqué
WRInaute impliqué
 
Messages: 855
Inscription: 31 Mai 2004

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 17:48

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é
WRInaute passionné
 
Messages: 1147
Inscription: 7 Mai 2009

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 18:47

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é
WRInaute impliqué
 
Messages: 855
Inscription: 31 Mai 2004

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Ven Mai 29, 2009 21:12

Effectivement j'avais lu un peu trop rapidement le premier message.


WebRankInfo
Administrateur du site
Administrateur du site
 
Messages: 19415
Inscription: 19 Avr 2002

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Sam Mai 30, 2009 8:15

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


fandecine
Modérateur
Modérateur
 
Messages: 2047
Inscription: 2 Avr 2005

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Dim Mai 31, 2009 17:38

Aurais-je un fils ... spiryuel !? :mrgreen:

Merci lyonist pour ces modifs trés pertinantes :wink:

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

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

Je vais m'y remettre :wink:


phpmikedu83
WRInaute passionné
WRInaute passionné
 
Messages: 1281
Inscription: 6 Aoû 2005

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Dim Mai 31, 2009 18:58

En utilisant des preg_replace déjà, ça sera plus performant... ;)


bruno212
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 497
Inscription: 13 Fév 2005

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Dim Mai 31, 2009 20:42

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


VisitezMonSite
WRInaute passionné
WRInaute passionné
 
Messages: 1147
Inscription: 7 Mai 2009

Re: [tutoriel] Mise en cache en PHP, la version complète.

Message le Dim Oct 11, 2009 15:52

@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) ?

phpmikedu83 a écrit:En utilisant des preg_replace déjà, ça sera plus performant... ;)

Ou un str_replace c'est encore plus rapide :-)


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

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 :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité