1. ‍Vérifiez vos pages zombies SEO sur votre site !!! Elles plombent votre référencement et ne vous rapportent rien... Je le détaille dans mon tuto Pages Zombies SEO
    Rejeter la notice

[script] Mise en cache des pages PHP

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par fandecine, 17 Mai 2005.

  1. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    :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:
    [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:
    
    
     
  2. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    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:
    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?
     
  3. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    c'est ça! :D
     
  4. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    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.
     
  5. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    j'y avais pensé, mais quand je fais des mises à jour, ça concernne parfois des centaines de pages et là le ftp est imbatable!
     
  6. caro
    caro WRInaute impliqué
    Inscrit:
    21 Juillet 2003
    Messages:
    828
    J'aime reçus:
    0
    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
     
  7. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 768
    J'aime reçus:
    153
    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...
     
  8. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    meuh non! t'es pas casse pieds carole! :D

    je t'ai rajouté tout plein de commentaires.
     
  9. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    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)
     
  10. Madrileño
    Madrileño Membre Honoré
    Inscrit:
    7 Juillet 2004
    Messages:
    33 651
    J'aime reçus:
    258
    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 ;)
     
  11. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    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 ;-)
     
  12. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 768
    J'aime reçus:
    153
    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");
    
     
  13. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    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:
    <?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!
     
  14. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Et je crois que tu as oublié de préciser que c'est un cache d'un an non?

    3600*24*360
     
  15. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    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
     
  16. oberon
    oberon WRInaute discret
    Inscrit:
    26 Septembre 2003
    Messages:
    152
    J'aime reçus:
    0
    marrrant, j'ai implémenté le même système il y a un an pour le site de mon boulot :)
     
  17. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Code:
    <form action="<?php dcPostUrl(); ?>" method="post" id="comment-form">
    <fieldset>
    
    j'ai ça dans une page, et dans le cache <?php dcPostUrl(); ?> = rien du tout.

    en gros dans le cache ça me donne:

    Code:
    <form action="" method="post" id="comment-form">
    <fieldset>
    
    une idée du pourquoi du comment?
     
  18. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    peut-tu nous donner le source de la fonction dcPostUrl()
     
  19. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Code:
    @function dcPostURL
    
    Cette fonction affiche l'URI du billet, son permalien. On l'utilisera dans
    l'affichage d'un billet (boucle ou pas). Par exemple:
    
    |<a href="<?php dcPostURL(); ?>">lien permanent</a>
    */
    function dcPostURL()
    {
    	echo $GLOBALS['news']->getPermURL();
    }

    et bien sur je suis allé cherché après getpermurl:

    Code:
    # Lien permanent vers le commentaire
    	function getPermURL()
    	{
    		$post_titre_url = $this->blog->str2url($this->f('post_titre'));
    		
    		$url = sprintf($this->blog->front_url['post'],$this->f('postyear'),
    					$this->f('postmonth'),$this->f('postday'),
    					$this->f('post_id'),$post_titre_url);
    		
    		return $url.'#c'.$this->f('comment_id');
    	}
     
  20. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    là, ça se corse! y a des variables partout! Faudrait voir le code complet. Si ça te pose vraiment de gros problèmes envoie moi le code par mp, je regarde ça demain.
     
  21. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Je trouve le code assez mal fait en fait... Peut etre parsque j'ai pas tout comprit mais:

    Votre page PHP ici

    moi cette partie je l'aurai mit dans

    if ($fd) {

    en adaptant histoire de n'executer le code php QUE SI LE CACHE n'existe pas, car la j'ai l'impression que tu l'executes de toute façon non?
     
  22. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    pourtant, j'ai mis les commentaires JeunZ! Tu est fatigué ou tu me teste?

    le secret c'est ob_start(); à partir de la, tout ce qui suit n'est pas envoyé au navigateur mais bufférisé.

    ensuite, ob_get_contents() récupére le contenu du buffer, on peut alors areter la bufferisation avec ob_end_flush() et sauvegarder le contenu dans le fichier cache.

    simple, non?
     
  23. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Je suis d'accord (je suis pas un pro je vais sans doute dire une connerie, surtout que je n'ai jamais utilisé cette histoire de buffer), mais même si ce n'est pas envoyé au navigateur c'est executé coté serveur non?

    (aie ca y est je crois que j'ai dit la connerie).
     
  24. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Forcement, c'est du php. :wink:
     
  25. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Et bien alors si on met une condition sur l'existance du fichier cache on peut ne pas executer le code php et ainsi économiser des ressources serveurs.


    Si cache alors on met le cache sinon on execute le code php et on génère le cache.


    C'est mieux que :

    On execute le code php, si le cache existe on affiche le cache sinon on génère le cache et on affiche le code php.


    Dans la seconde solution celle présentée ici on execute toujours le code php alors que dans un cas c'est inutile je crois.
     
  26. itsme
    itsme WRInaute impliqué
    Inscrit:
    13 Octobre 2004
    Messages:
    666
    J'aime reçus:
    0
    Vous savez que JP-Cache fait tout cela tres bien, rapidement et depuis tres longtemps ? ;)
     
  27. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    Code:
    if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page existe dans le cache et n'a pas expirée 
       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 
    } 
    
    Jeunz -> c'est ce qu'il fait. Avant de buffériser, il teste si le cache n'est pas expiré, si c'est le cas il fait le include du fichier en cache, sinon il exécute le code en le bufférisant
     
  28. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Ba alors je comprend pas car avec la méthode ci dessu testé hier pendant 3h la charge de mon dédié n'a pas changé par contre j'avais un affichage un peu plus rapide.

    J'ai fait ma modif, et ma charge est depuis lors divisée par 10...
     
  29. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    Tu peux mettre ta modification? Est-ce que tu as pu constater que des fichiers étaient créés dans le répertoire cache?
    C'est bizarre, parce que dans la logique du script de fandecine, il n'exécute le php que si le fichier est expiré...
     
  30. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Attention! Si la page PHP que tu met en cache consomme peu de resources, tu vera pas de changement notoire de charge. Par contre si ttu fait un max de requettes Mysql, y a pas photo ni sur la vitesse de chargement, ni sur la charge du serveur.

    Par exemple, lorsque je fais une grose Maj sur mon site, je peux te dire que je vois la charge grimper en fleche jusqu'a ce que le cahe soit regénéré.

    Maintenent je serais curieux de voir ton code modifié!?
     
  31. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Ma page consomme énormément niveau sql, 6000 blogs actifs imagine...

    Dans les deux cas je génére des fichiers .html dans le cache c'est normal.

    Je vous met mon code mais attention faut le suivre ;-)

    et si vous doutez de se que je dis allez voir ma charge serveur depuis 2h heure à laquelle j'ai effectué ma modif:
    http://ns32019.ovh.net/mrtg/mrtg-sys/

    Code:
    <?PHP
    
    
    require '/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/themes/stats.php';
    
    
    
    $num=substr_replace($_SERVER['HTTP_HOST'], '', -13);
    $ext=substr_replace($_SERVER['HTTP_HOST'], '', 0, -3);
    $db1 = mysql_connect("localhost","xxxxxxxxx","xxxxxxx");  
    mysql_select_db("xxxxxxxxxx",$db1);
    list($id_blog) = mysql_fetch_array(mysql_query("SELECT id FROM membres WHERE identifiant='$num' AND domaine='$ext'", $db1), MYSQL_NUM); 
    mysql_close($db1);
    
    
    # ------- Create directories if directories do not exist
    
    $rep= '/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/cache/' .$id_blog .'/';
    
    if (!is_dir($rep)){  
    
    mkdir ( $rep, 0777);
    
    }
    
    
    $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= "/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/cache/" .$id_blog ."/".$urldemandee; // on construit le chemin du fichier cache de la page
    if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page existe dans le cache et n'a pas expirée
       ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
    
    
     
    
       
       
    
    
    
       $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
       if ($fd) {
    
    
    # Chemin vers la racine de l'application (si vous changer le fichier de place)
    $app_path = '/';
    
    
    # NE RIEN CHANGER APRES CETTE LIGNE
    
    $blog_file_path = __FILE__;
    $blog_dc_path = dirname(__FILE__).$app_path;
    
    require $blog_dc_path.'/layout/prepend.php';
    
    
    # En-têtes et prologue
    # Envoie des en-tête HTTP
    $accept_xml =
    	!empty($_SERVER['HTTP_ACCEPT']) &&
    	strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') !== false;
    
    if (dc_send_real_xml && $accept_xml) {
    	header('Content-Type: application/xhtml+xml');
    } else {
    	header('Content-Type: text/html; charset='.dc_encoding);
    }
    
    //if ($accept_xml) {
    //	echo '<?xml version="1.0" encoding="'.dc_encoding.'"    '."\n";
    //}
    
    
    
    
    include $dc_template_file;
    
    
    require $blog_dc_path.'/layout/append.php';
    
    
       $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
       ob_end_flush();// on termine la bufferisation
    
    
    
          fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
          fclose($fd);
         }
    } else { // le fichier cache existe déjà
    
    
    
    
    if (!empty($_POST['redir'])) {
    
    
    # Chemin vers la racine de l'application (si vous changer le fichier de place)
    $app_path = '/';
    
    
    # NE RIEN CHANGER APRES CETTE LIGNE
    
    $blog_file_path = __FILE__;
    $blog_dc_path = dirname(__FILE__).$app_path;
    
    require $blog_dc_path.'/layout/prepend.php';
    
    
    
    }
    else{
      include ($fichierCache); // on le copie ici
    }
    
    
    }
    
    
    
    
    
    
    
    
    ?>
    
    
    
    
     
  32. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    hum! c'est dur de lire du code que l'on a pas écrit!

    Bon, en fait, que tu ouvre le fichier cache avant ou aprés la fermeture du buffer ne change rien à l'algorythme. Par contre, je suis étonné que ce changement diminu la charge du serveur! est-tu sur que les fichiers caches n'existaient pas déjà quand tu a modifié le script? Faut que je teste!!!

    Par contre une remarque sur ton script: ta requete mysql, pourquois ne la met-tu pas en cache? un processus mysql ça consomme, et si tu a un gros traffic...
     
  33. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Oui t'inquiete je vais la mettre en cache, c'était juste le temps de tester...

    En fait le truc c'est que j'avais mal lu ton code j'avais pas fait gaffe à cette ligne:

    if (@filemtime($fichierCache)<time()-(3600*24*360)) {


    donc c'est moi qui avait mal lu ton code ;-)
     
  34. caro
    caro WRInaute impliqué
    Inscrit:
    21 Juillet 2003
    Messages:
    828
    J'aime reçus:
    0
    Re: Mise en cache des pages PHP

    fallait que tu m'embrouilles jeunz, ce coup ci je comprends plus rien du tout :lol:

    if (@filemtime($fichierCache)<time()-(3600*24*360)) {
    ob_start();
    si la page existe et n'a pas expiré, pourquoi on bufferise plutot que directement récupérer include ($fichierCache); ?

    tu te serais pas trompé dans l'annotation d'explications, ce serait pas le contraire :
    if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou a expirée
    ob_start(); // on démarre la bufferisation de la page

    oulà :oops:
     
  35. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    Il fait: time()-(3600*24*360) , ce qui correspond à l'heure actuelle il y a un an.
    Ensuite: filemtime($fichierCache)<time()-(3600*24*360), ce qui correspond à : est-ce que la date du fichier cache est inférieure à l'heure actuelle moins un an? ou plu simplement est-ce que le fichier est plus vieux d'un an?
    Si c'est le cas on bufferise pour recréer le cache...

    Edit: désolé je pensais que tu ne comprenais pas l'instruction php... :oops:
     
  36. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Oups! j'ai fait une erreur de commentaire; :oops:

    c'est "si la page n'existe pas dans le cache ou si elle a expiré";

    je corrige de suite!

    Bravo, caro! tu est la seule à avoir remarqué la bourde! :D
     
  37. caro
    caro WRInaute impliqué
    Inscrit:
    21 Juillet 2003
    Messages:
    828
    J'aime reçus:
    0
    merci beaucoup fandecine, maintenant je comprends bien ton code et je le trouve excellent !
    je te félicite et te remercie de nous avoir fait partager ton expérience.
    mon serveur aussi te remercie :lol: :lol: :lol:
    carole
     
  38. JeunZ
    JeunZ WRInaute accro
    Inscrit:
    18 Février 2004
    Messages:
    4 277
    J'aime reçus:
    0
    Ba non c'est se qui m'embrouillait aussi et depuis hier lol.

    J'ai été obligé de virer tes commentaires pour tenter de comprendre en début d'aprem lol.
     
  39. caro
    caro WRInaute impliqué
    Inscrit:
    21 Juillet 2003
    Messages:
    828
    J'aime reçus:
    0
    en tout cas encore merci fandecine :wink:
     
  40. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
  41. Cartapus
    Cartapus WRInaute occasionnel
    Inscrit:
    18 Juin 2004
    Messages:
    407
    J'aime reçus:
    0
    Une question, comment se comporte ce système vis à vis des robots d'indexation? voient ils toujours les mêmes pages ou n'y aurait il pas un problème de duplicate content dû au fait que l'extension html apparaisse? :)
     
  42. Phix
    Phix WRInaute occasionnel
    Inscrit:
    15 Juin 2004
    Messages:
    352
    J'aime reçus:
    0
    Pour le visiteur comme pour le robot, il n'y a pas de différence. Ce script mais juste en cache le contenu ou l'inclut s'il est déjà en cache, c'est complètement invisible (enfin pas au niveau du serveur, qui peut souffler un peu :lol: )
     
  43. Cartapus
    Cartapus WRInaute occasionnel
    Inscrit:
    18 Juin 2004
    Messages:
    407
    J'aime reçus:
    0
    Merci pour ta réponse en fait je n'avais pas lu le script avant de poser ma question, j'ai pas l'air fin maintenant :mrgreen:
     
  44. romane
    romane WRInaute discret
    Inscrit:
    4 Avril 2005
    Messages:
    59
    J'aime reçus:
    0
    salut,
    J'essais de comprendre cette nouvelle notion (pour moi) de mise en cache!
    Je suis en train de créer un site proposant la possibileté de créer des albums photos! Parconséquent il semble judicieux d'utiliser la mise en cache!(pour éviter de répéter toutes les requetes MySQL)
    Si j'ai bien compris, il me faudra régénérer le cache à chaque fois qu'un nouveau utilisateur met à jour son album????
    (dites moi si c'est ca SVP)

    merci
    bye
     
  45. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    bonjour,

    La page en cache est généré automatiquement lors du chargement de la page de ton site. Si tu fait une mise à jour d'une page, le mieux est de faire un script qui efface la page correspondante du cache lors de la mise à jour.
     
  46. romane
    romane WRInaute discret
    Inscrit:
    4 Avril 2005
    Messages:
    59
    J'aime reçus:
    0
    ok merci,
    donc si je suis bien, si un utilisateur rajoute une photos (par exemple), je suprime l'ancien cache et j'en créer un nouveau?
     
  47. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    pas tout a :? fait!

    tu suprime le fichier correspondant du cache, le nouveau sera créé automatiquement lors du premier chargemlent de la page! :D
     
  48. romane
    romane WRInaute discret
    Inscrit:
    4 Avril 2005
    Messages:
    59
    J'aime reçus:
    0
  49. romane
    romane WRInaute discret
    Inscrit:
    4 Avril 2005
    Messages:
    59
    J'aime reçus:
    0
    bon je suis aller lire d'autre info pour essayer de comprendre et en gros:
    if (je regarde si le cache existe et s'il existe) {
    j'affiche le cache
    }

    else //le cache n'existe pas
    {
    je sors la page php
    }

    la structure ressemble-t-elle à ca!!!?
     
  50. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    if (je regarde si le cache existe et s'il existe) {
    j'affiche le cache
    }

    else //le cache n'existe pas
    {
    je sors la page php et je la met en cache
    }

    Comme ça, c'est mieux! :wink:
     
  51. romane
    romane WRInaute discret
    Inscrit:
    4 Avril 2005
    Messages:
    59
    J'aime reçus:
    0
    A voui!!! j'avais oublié de remettre le tout de la cache!!! (sacré moi!!!)
    Merci beaucoup en tout cas!
     
  52. kinglouis
    kinglouis WRInaute discret
    Inscrit:
    19 Mai 2004
    Messages:
    83
    J'aime reçus:
    0
    Bonjour ,

    J'ai quelques questions bêtes :

    1 ) Dans le code donné sur la page d'accueil , il faut juste mettre notre contenu entre les balises [ i ] ?

    2 ) Ca va générer un fichier dans le FTP c'est bien ça ?

    3 ) Quand on fait une modification on supprime manuellement le fichier créé ?

    Merci pour vos réponses
     
  53. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Une question bien formulée n'est jamais bête! :wink:

    Oui
    Le fichier est généré dans le dossier cache
    Tu peux aussi utiliser le script php dont j'ai donné le source plus haut dans ce fils.
     
  54. kinglouis
    kinglouis WRInaute discret
    Inscrit:
    19 Mai 2004
    Messages:
    83
    J'aime reçus:
    0
    Merci à toi mais

    Le dossier cache c'est :
    _ un truc que l'on créé sur notre serveur
    _ un truc sur l'ordi du visiteur

    ??

    Merci
     
  55. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Un truc (repertoire) que tu crée sur ton serveur!
     
  56. kinglouis
    kinglouis WRInaute discret
    Inscrit:
    19 Mai 2004
    Messages:
    83
    J'aime reçus:
    0
    Bonjour ,

    Alors j'ai essayé :

    1 ) J'ai inséré ce code dans une page :
    Code:
    <?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
    
    
    
    echo"lolo";
                    
                  
    
       $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
    }
    ?>
    Ce code est dans une page test.php située dans le dossier test

    2 ) J'ai créé un dossier cache en lui mettant les droits CHMOD 777 ( pareil pour le dossier ou se trouve le fichier )

    3 ) J'execute mon fichier et :
    _ le fichier cache-test-test.php est créé
    _ il est toutefois vide

    Ou est l'erreur ?

    Merci
     
  57. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Ajoute echo $contenuCache; juste aprés la ligne ob_end_flush();

    Tu doit obtenir:

    lolololo lorsque tu affiche ta page test.php.

    Si ça marche pas, cela veut dire que la bufferisation ne marche pas. Peut tu me dire quelle version de PHP tu utilise?
     
  58. kinglouis
    kinglouis WRInaute discret
    Inscrit:
    19 Mai 2004
    Messages:
    83
    J'aime reçus:
    0
    Ca marche avec ton code :


    Code:
    <?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
    
    
    
    echo"lolo";
                    
                  
    
       $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
       ob_end_flush();// on termine la bufferisation
       echo $contenuCache;
       $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
    }
    ?>
    Merci !

    ( Version de PHP : PHP Version 4.3.10 )
     
  59. kinglouis
    kinglouis WRInaute discret
    Inscrit:
    19 Mai 2004
    Messages:
    83
    J'aime reçus:
    0
    Euh y a juste un truc , quand je rajoute echo $contenuCache; , la première fois que j'execute ça m'affiche 2 fois le contenu .

    C'est que a première fois donc ça va mais y aurait pas une petite astuce pour que ça le fasse pas ?
     
  60. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    je t'ais fait faire ce test pour savoir si la bufférisation marchait. Donc elle marche!

    Tu peut effacer la ligne que je t'ai fais rajouté. Efface le fichier dans le cache et essaye à nouveau. Si tu as un problème, contacte moi par MP.
     
  61. tawath
    tawath WRInaute occasionnel
    Inscrit:
    30 Avril 2005
    Messages:
    269
    J'aime reçus:
    0
    Bonjour
    Ce serait possible de rajouter le code pour vérifier qu'il n'existe pas de page plus récente dans la db et de mettre le cache à jour en conséquence :oops:
     
  62. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Si je comprends bien ce que tu veux faire, c'est de tester dans la BDD la date de mise à jour de la page et si la date est plus recente que le fichier en cache, générer un nouveau fichier dans le cache?
     
  63. itsme
    itsme WRInaute impliqué
    Inscrit:
    13 Octobre 2004
    Messages:
    666
    J'aime reçus:
    0
    heu... pourquoi re-inventer la poudre ? il y a jpcache qui fait tout cela tres bien :/
     
  64. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    et pourquoi pas! :oops:

    Ce fil a aussi des vertus pédagogiques en faisant découvrir de nouvelle fonction PHP à tous ceux qui se lancent, en expliquant des mécanismes et en les personnalisants.

    Par exemple, je prépare une petite modification de ce script pour générer automatiquement lors de la mise en cache le fameux fichier XML GoogleSitemap! :D

    Je le teste et le publie dés que possible!
     
  65. tawath
    tawath WRInaute occasionnel
    Inscrit:
    30 Avril 2005
    Messages:
    269
    J'aime reçus:
    0
    Affirmatif :wink:
    Tu m'a compris j'ai pas envie de jouer du ftp pour supprimer une page parmi des centaines.... :?
    Ton script?
    avec joie si il génére aussi la sitemap pour gogol1er que du bonheur :D Je te guette Fan!

    Jpcache je vais me documenter,masi quitte à reinventer la poudre on peut l'améliorer parfois :wink:
     
  66. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    ok tawath!

    si t'es pas trop pressé, je publie tout ça dans la semaine, car là, je suis un peu charette! :wink:
     
  67. tawath
    tawath WRInaute occasionnel
    Inscrit:
    30 Avril 2005
    Messages:
    269
    J'aime reçus:
    0
    Impecable je suis prêt à beta-tester :)
    Bonne nuit
    ps:moi aussi je suis chariot cette semaine :cry:
     
  68. Fab le Fou
    Fab le Fou WRInaute passionné
    Inscrit:
    2 Décembre 2004
    Messages:
    1 292
    J'aime reçus:
    0
    Avec le même objectif d'accélérer le chargement des pages et diminuer la charge du serveur, je suis entrain de revoir le fonctionnement d'un de mes sites.

    En fait, au lieu d'appeler la base de données à chaque fois qu'un visiteur appelle une page, je ne le fais qu'une seule fois dans mon backoffice au moment où je mets à jour mes données.

    Si l'enregistrement s'est bien passé j'appelle alors des fonctions qui vont générer ou modifier les fichiers contenant le code client qui apparait dans mes pages (via des include()).

    En fait, mes pages "pseudo-statiques" seront composées de plusieurs fichiers, qui seront modifiés si il y a lieu lors des mises à jour (il n'y a pas de durée d'expiration à priori).

    Cette solution n'est pas meilleure que celle proposée ici, mais c'est une alternative possible ayant un même but.

    Fab
     
  69. hipopulation
    hipopulation WRInaute occasionnel
    Inscrit:
    28 Juillet 2004
    Messages:
    310
    J'aime reçus:
    0
    yep, faut que je teste cette histoire de mise en cache, je connais ça avec SPIP et c'est vrai que c'est plutot efficace:)
     
  70. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    Bonjour,

    Alors tout d’abords un grand bravo pour ce partage…. ! Et félicitation…

    Cependant quelques questions me taraudent encore…

    - Vous dites que cela sera efficace en fonction du nombre de requête que l’on évite au serveur en mettant le code généré en cache. Mais quel est à peu près le nombre de requête ? (je comprends bien que cela dépends des requêtes, mais il s’agit juste d’avoir une idée)

    - Je n’est pas bien saisie concernant le dossier cache, faut-il simplement le créer ? (dans ce cas quel droit unix doit-on lui donner, à quel endroit le créer ? public_html ?)

    - Vous dites que cela est avantageux si l’on est sur un serveur dédié… Mais si le dossier cache est à la racine de notre site, cela revient au même pour un serveur mut. Car le principe reste le même ! Plus besoin de régénérer le document, il est directement envoyé ? ai-je bien compris…. ?

    - Si l’on possède un forum, on applique aussi ce type de méthode ? (je pense que ce doit-être lourd, non ? chaque modification supprimer la page en cache, la recréer en cache à la première demande…cela peut-être lourd pour un forum subissant beaucoup de modifications ?)

    - Enfin, pour supprimer la page en cache (j’ai bien bien compris qu’il y a un une méthode ftp) mais par impossibilité de procéder comme ceci, je souhaiterais savoir s’il existe une fonction (un code comme pour l’ajout en cache) qui permettrais de supprimer la page en cache à chaque modifcation…(par exemple un site administrable, qui voit son accueil modifier une foi par semaine, cette méthode serait très aventageuse !


    Désolé de toutes ces interrogations, mais en tout cas encore un grand bravo….
    Merci !!!!!!!!!!
     
  71. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    merci! :wink:
    par exemple, sur le site de mon profil, il faut compter 5 à 6 requêtes sql par page en moyenne (un peu plus pour la page d'accueil et les têtes de rubriques, un peu moins pour les pages de contenu) à multiplier par 15 à 20.000 pages par jours (pointe du traffic entre 18h30 et 21h30) soit en pointe 8 à 10.000 requêtes sql à l'heure!
    le dossier cache doit être accessible par un script php (je le met à la racine du site). Pour ce qui est des droits, public en lecture bien sur, en ecriture cela dépends de la config du serveur. Il peut etre en 755 par exemple si php en est le propriétaire.
    Lorsque je dis que c'est moins interressant sur un mutualisé c'est parce que les ressources étant partagées par plusieurs sites, si il n'utilisent pas tous la mise en cache, l'éconnomie de resources sql peut ne pas être significative. En fait, si tu utilise la mise en cache sur ton site sur un mutualisé, tu partage le gain de ressources entre tous les sites héberges sur ce serveur.
    si ton forum est rewrité, ce n'est pas trés sorcier à mettre en place ni lourds. Par contre, s'il n'est pas rewrté, il te faut faire une tranformation d'une url en nom de fichier valide et unique. En fait, la taille du site n'est pas un problème (le site de mon profil compte plus de 50000 pages!), la fréquence de mise en jours non plus (je fait des mises à jour tout les jours) cela impose seulement beaucoup de rigueur et une structure de site simple et claire pour ne pas oublier d'effacer des pages lors des mises à jour (une simple mise à jour peut effacer 3 à 400 pages du cache)
    Si tu ne peux pas utiliser les fonctions ftp, tu peux essayer avec la fonction unlink de php.

    voila! :D
     
  72. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    Ok ! merci pour ces éléments complémentaires...

    Donc il s'agit bêtement d'un dossier quelconque que l'on utilise pour gérer notre cache....

    Oui mais.... :) :oops: ... il y aura tout de même un gain de temps pour l'utilisateur...sans doute que pour les ressources cela sera inutile pour un hebergement mut., mais si un utilisateur demande une page déjà existante dans le cache se sera plus rapide que de la recréer...? donc il y a tout de même un gain...(aussi bien pour moi que pour les autres héberger) c'est d'ailleur aussi le but du cache...(ok pour les ressources mais pour cela aussi (vitesse)...non ?)

    Ce que je voulais dire, c'est qu'il peut savèrer plus long, pour l'utilisateur...
    je m'explique, pour un forum, en prennant un sujet, s'il subit beaucoup de modification, il faudra non seulement rechercher la page dans la base de données mais en plus de ca il faudra très souvent ajouter ou supprimer dans le cache...donc la ou je veux en venir c'est que l'on peut etre perdant du fait que si c'est quelque chose qui est souvent modifié...on effectue plus de commande...donc pas de gain...voyez ou je veux en venir ?

    voila! :roll:
     
  73. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    snif...ne me laissé pas seul ! lol
     
  74. tawath
    tawath WRInaute occasionnel
    Inscrit:
    30 Avril 2005
    Messages:
    269
    J'aime reçus:
    0
    Hello
    je fais tourner un cache sur un site en mutualisé ca soulage sans plus
    en cas de requêtes multiple la db ne decroche plus
    sur un site en duplicate mais dans un sous-domaine du premier
    pas de cache et l'index s'affiche en moitie moins de temps...
    La science s'interroge :oops:
     
  75. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 200
    J'aime reçus:
    0
    Merci beaucoup !

    J'ai dû modifier ce script un peu, pour l'adapter (sur un site basé sur phpBB, utilisant des templates, il faut bien générer un cache différent par template, éviter de laisser traîner des liens non autorisés -admin, mod- dans le cache).

    J'espère que ça réduira le nombre d'erreurs "maximum de connections simultanées" :(
     
  76. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    c'est fait pour ça! :wink:

    D'aprés mes calculs et surtout mon experience (18 mois de recul avec ce script!) j'ai augmenté la capacite d'un de mes dédiés de 75%! C'est pas rien , surtout si on fait le calcul à l'envers en partant du prix du serveur! :D
     
  77. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    Ok ! merci pour ces éléments complémentaires...

    Donc il s'agit bêtement d'un dossier quelconque que l'on utilise pour gérer notre cache....

    Oui mais.... :) :oops: ... il y aura tout de même un gain de temps pour l'utilisateur...sans doute que pour les ressources cela sera inutile pour un hebergement mut., mais si un utilisateur demande une page déjà existante dans le cache se sera plus rapide que de la recréer...? donc il y a tout de même un gain...(aussi bien pour moi que pour les autres héberger) c'est d'ailleur aussi le but du cache...(ok pour les ressources mais pour cela aussi (vitesse)...non ?)

    Ce que je voulais dire, c'est qu'il peut savèrer plus long, pour l'utilisateur...
    je m'explique, pour un forum, en prennant un sujet, s'il subit beaucoup de modification, il faudra non seulement rechercher la page dans la base de données mais en plus de ca il faudra très souvent ajouter ou supprimer dans le cache...donc la ou je veux en venir c'est que l'on peut etre perdant du fait que si c'est quelque chose qui est souvent modifié...on effectue plus de commande...donc pas de gain...voyez ou je veux en venir ?

    voila! :roll:

    Peut tu me renseigner fandecine STP ?
    merci bcp...!!!!!!!!!
     
  78. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    Houlala! Veux me faire bosser un 14 juillet! :wink:

    Tout à fait! Même le nom du dossier est arbitraire...

    Le gain de vitesse est fonction du nombre de requêtes sql présent dans la page.


    Quelquesoit le nombre de modifications, dans le pire des cas (c'est à dire quand la page n'est pas en cache) le système se comporte comme si il n'y avait pas de cache (l'effacement d'un fichier dans le cache consommant trés, trés peu de ressources). Si tu tiens compte du fait qu'un post dans un forum est 10 fois plus lu que modifié, le gain en ressources reste trés important.

    Voila! :D
     
  79. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    Ok !

    désolé de te faire bossé le 14 juillet ! :wink:

    en tout cas merci beaucoup pour ton aide et tes renseignements !!!

    Merci à toi,
    bonne journée... :wink: :wink: :wink:
     
  80. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 200
    J'aime reçus:
    0
    Du cache sur les pages d'un forum ?
    C'est quand même plutôt difficile, dès que le forum est actif... il faudrait pouvoir tester si on est sur la dernière page du sujet ou pas, pour éviter de plomber les conversations pendant 10 minutes !

    Sur index.php ou viewforum.php, encore, c'est davantage réalisable (et encore !)

    Edit : ok j'ai compris... l'astuce serait de supprimer le cache quand un nouveau message est posté dans le sujet :)
     
  81. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    c'est pas plus compliqué que ça! :wink:
     
  82. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    fandecine ! il y a juste encore un truc que je ne comprends pas !

    pourquoi tester si le fichier date d'y à moins d'un an ?

    Code:
    if (@filemtime($fichierCache)<(time()-(3600*24*360)))
    et ne pas plutôt tester tout simplement si le fichier existe...!?

    car la tous les an il faut recréer le fichier ! bien que ce ne soit pas méchant ! ce n'est pas utile non plus....
     
  83. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    c'est juste un exemple!

    en fait, tu met la date que tu veux! Si ta page est mise à jour toutes les semaine, tu met une semaine et hop! le cache est mis à jour automatiquement! :D
     
  84. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    oui mais ce que je veux dire (et faire... lol)
    c'est par exemple dès qu'il y à une modification sur une page, l'effacer de la cache...donc à la première demande elle sera remis à jour automatiquement...

    donc la inutile de tester sur la date...
    Autant faire un file_exist non ?
     
  85. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    si tu veux...
     
  86. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    non mais c'était juste une question...

    pourquoi procède tu de la sorte toi ?
    en fait perso je n'en voyais pas l'utilité, je pense que tu ma compris...
    si tu efface de la cache à chaque modification...pas besoin de tester en date !

    mais bon comme di, c'est une simple proposition...et une question qui me trotait ! donc vla....
     
  87. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    Excuse moi, je me permet encore de t'embeter un petit peu...

    j'ai lu les fonctions ob_get_contents et ob_end_flush !

    ob_end_flush : Envoie les données du buffer de sortie et éteint la bufferisation de sortie

    et

    ob_get_contents : Retourne le contenu du buffer de sortie

    pourquoi utiliser ob_get_contents si ob_end_flush renvoie aussi le contenu ?

    y a t-il une raison par sécurité ou ça ne renvoie pas la même chose ?

    Merci !!! :oops:
     
  88. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    et pourquois pas! :wink:

    voila pourquoi!
     
  89. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    oui mais inutile dans ce cas ou alors utiliser ob_end_clean() ! non ?

    :oops: :oops: désolé ! j'essaye juste de comprendre !
    lol j'essaye...
     
  90. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    c'est bon j'ai compris !

    si on utilise ob_end_clean() on efface le buffer ! mais on ne reprend pas le contenu pour l'afficher ! nous l'avons repris pour le mettre dans une variable mais pas dans l'affichage ilico ! bien compris ! merci encore et désolé !

    Par contre pour gérer des passages de variable (?test=rien) quel procéder employez-vous ?

    EDIT:

    si l'on pratique l'url rewriting, est ce que le paramètre REQUEST_URI se base sur l'url réécrite ou sur celle entrée par l'utilisateur ? (dans le deuxième cas cela facilite la tâche) ?
     
  91. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 950
    J'aime reçus:
    0
    REQUEST_URI contient l'url rewrité.

    Si pas de rewriting, il faut convertir l'url avec les parametres en nom de fichier unique.
     
  92. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 841
    J'aime reçus:
    0
    ok ! donc ca simplifie tout si l'on emploie l'url rewrité !!!
    (enfin si j'ai bien compris:
    url de l'utilisateur:
    www.site.fr/page-8.html

    url réécrite:
    www.site.fr/?page=8

    mais le REQUEST_URI se base sur www.site.fr/page-8.html ?
    bien compris ? aïe

    impecable ce script !!!

    encore bravo !
    je crois que ça y est ! j'ai fini de vous embettez !!!!

    merci mille fois..........!!!!!!!!!!!
     
  93. anamorph
    anamorph Nouveau WRInaute
    Inscrit:
    17 Décembre 2004
    Messages:
    31
    J'aime reçus:
    0
    Salut à tous,

    Je n'arrive pas encore à faire fonctionner ce fameux script comme je voudrais. En fait j'ai un bout de code tout simple qui s'occupe de charger/renvoyer un flux passé en paramètre grâce à la méthode readfile), je me sert de ce script pour charger des fichiers xml se trouvant sur un domaine différent (la méthode javascript xmlHttpRequest ne supportant pas des appels sur des domaines différents)
    Les fichiers sont bien crée en cache mais l'appel au php me revoit :
    Code:
    Parse error: parse error, unexpected T_STRING in
    Je me demande s'il n'y a en fait pas une histoire que codage de caractères .. Mon code:

    Code:
    <?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
    ?>
    <?php
    header("Content-Type: text/xml");
    $flux = $_GET['url'];
    // make sure that some page is really being called
    if ($flux && $flux != ""){
    	// make sure that an http call is being made - otherwise there's access to any file on machine...
    	if ((strpos($flux, "http://") === 0) || (strpos($flux, "https://") === 0)){
    		readfile($flux);
    	}
    }
    ?>
    <?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
    }
    ?>
    Merci de votre aide.
    Florent
     
  94. anamorph
    anamorph Nouveau WRInaute
    Inscrit:
    17 Décembre 2004
    Messages:
    31
    J'aime reçus:
    0
    je viens de résoudre mon problème :

    pour renvoyer le fichier j'utilise
    readfile($fichierCache) au lien de include ($fichierCache)

    en fait ce qui posait problème c'est la partie supérieur du xml : <?xml version="1.0" encoding="ISO-8859-1"?>

    qui devait être interprété comme du php.
     
  95. NoName
    NoName WRInaute discret
    Inscrit:
    4 Novembre 2004
    Messages:
    69
    J'aime reçus:
    0
    Hello ;)

    Pour ma part, j'attendait que jmCache soit compatible php5, mais apparement ils ne sont pas préssés :(

    J'essaye donc ce system, j'ai modifié le script de maniere a appeler une fonction pour les pages devant êtres mises en cache.

    Code effacé

    L'appel se fait de cette maniere :

    ------------------ debut page ------------------
    require('my_file.php5');
    le contenu de ma page
    caching();
    ------------------ fin page ------------------

    Pb, l'écriture du fichier ne fonctionne pas, et le $flag est bien = 5

    Une idée ?
     
  96. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 200
    J'aime reçus:
    0
    Bonjour,
    NoName, les variables globales dans une fonction c'est vraiment pas terrible, sers-toi plutôt d'un paramètre. Pour chercher le bug fais comme tout programmeur : mets des echo() pas à pas avec les valeurs des variables utilisées.
     
  97. Ohax
    Ohax WRInaute accro
    Inscrit:
    5 Juillet 2004
    Messages:
    5 356
    J'aime reçus:
    0
    comment faire pour ne pas mettre en cache une partie précise de la page ?
     
  98. charlynancy
    charlynancy Nouveau WRInaute
    Inscrit:
    10 Mai 2005
    Messages:
    11
    J'aime reçus:
    0
    Peux t - on se passer de la la base de données?

    Théoriquement le système de mise cache permet donc de travailler avec la base de données inactive.
    Si ce que je viens de dire n'est pas une infame connerie, la mise en cache présente un énorme intérêt m^me sur un serveur mutualisé.
    En effet, sur un serveur mutualisé, lorsqu'un barbare cohabite et met la base OUT, avec un script à la morre moi le noeud, ça permet d'avoir son site toujours actif.
    Pouvez vous me confirmer que ça permet bien de faire tourner le site sans base de donnée (une fois les pages mises en cache bien sur)???
     
  99. charlynancy
    charlynancy Nouveau WRInaute
    Inscrit:
    10 Mai 2005
    Messages:
    11
    J'aime reçus:
    0
    coment exclure certaine page du système de mise en cache

    Vos explications sont tellement bien faites que je ne suis plus foutu de réfléchir moi même.
    Voila mon probème j'ai dans mes pages un formulaires de recherche qui renvoie vers une page résultat qui bien sur n'est jamais la même.
    Bref comment mettre un test avant le script de mise en cache pour qu'on affiche directement cette page sans passer par le cache.
     
  100. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    681
    J'aime reçus:
    0
Chargement...
Similar Threads - [script] cache PHP Forum Date
[script] php class cache : accélérez vos pages ! Développement d'un site Web ou d'une appli mobile 8 Mars 2011
[script] Mise en cache des pages PHP - V2 Développement d'un site Web ou d'une appli mobile 6 Août 2010
[script] miniature et cache d'image à la volée Développement d'un site Web ou d'une appli mobile 13 Décembre 2013
[script] anti spam referrer Développement d'un site Web ou d'une appli mobile 20 Août 2015
[script] changer un texte en images Développement d'un site Web ou d'une appli mobile 10 Décembre 2013
[Script] Ajouter les boutons de partage des réseaux sociaux sans le tracking Développement d'un site Web ou d'une appli mobile 25 Août 2013
[Script] Clone légal? Développement d'un site Web ou d'une appli mobile 7 Avril 2013
[script] Comment charger un script différent suivant l'heure ? Help ! Développement d'un site Web ou d'une appli mobile 4 Octobre 2012
[script] Oméga-Annonces 1.5.1 - Php/MySqL Développement d'un site Web ou d'une appli mobile 4 Septembre 2012
[script] tracking formulaire d'affiliation Développement d'un site Web ou d'une appli mobile 5 Août 2012
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice