[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. SuperPJ
    SuperPJ WRInaute occasionnel
    Inscrit:
    15 Janvier 2005
    Messages:
    417
    J'aime reçus:
    0
    Le script de Fandecine est tout simplement énooooooooorme ! J'ai rarement vu un code aussi important qui soit aussi facile à intégrer. Bravo ;)

    Jusqu'à présent pour la mise en cache je concaténais la variable $html qui contient le code à afficher avant de décider à la fin de faire un "echo" ou un fwrite puis un "echo", mais il est clair que la fonction ob_start() est beaucoup plus pratique ! Elle a été créée sur mesure pour la mise en cache :D
     
  2. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    En fait tu met le code de début du cache là ou tu veux que démarre la mise en cache, et le code de fin, là où tu veux que cela se termine.

    Si ton site utilise des DIV absolus, tu peut même supperposer sur la partie en cache des choses qui ne le sont pas (j'utilise cette technique pour mes banières de pub, ce qui m'evite d'effacer le cache quand je veux changer un tag).

    En ce qui concerne le MOD pour PHPBB, il utilise une autre technique qui consiste à mettre en cache les requetes MYQL.
     
  3. Ohax
    Ohax WRInaute accro
    Inscrit:
    5 Juillet 2004
    Messages:
    4 920
    J'aime reçus:
    0
    Bonsoir,

    j'aimerai adapter ce script pour mettre en cache "mes archives" phpbb qui sont uniquemment consultées


    comment je peu faire ?
     
  4. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    j'ai commencé à écrire une solution de mise en cache pour PHPBB que je teste actuellement. Il me reste quelques mises au point à faire (c'est assez long car j'ai peu de tempsc à y consacrer et le code PHPBB ne m'est pas famillier)

    je publierais tout cela lorsque ce sera terminé et fiabilisé.
     
  5. Ohax
    Ohax WRInaute accro
    Inscrit:
    5 Juillet 2004
    Messages:
    4 920
    J'aime reçus:
    0
    oui mais j'aimerai une mise en cache totale vu qu'il s'agit d'archives qui sont consultés uniquemment

    j'ai tenté d'utiliser le script pour le faire mais ça ne fonctionne pas apparemment
     
  6. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    668
    J'aime reçus:
    0
    Bah en fait le principe de ce script est assez simple :
    Deux types de cache sont utilisés.
    On peut les identifier :
    Les ligne contenant :
    Code:
    $db->sql_query($sql, false, true)
    cachent les requètes dont le cache sera effacé quand un chagement à lieux dans la partie admin.
    Les lignes contenant :
    Code:
    $db->sql_query($sql, false, 'posts_')
    cachent les requètes dont le cache sera effacé quand un nouveau message sera posté ou modifié.

    Du coup pour une mise en cache total, je pesne qu'il faudrait tenter de cacher les requète sql concernées en utilisant :
    Code:
    $db->sql_query($sql, false, 'posts_')
    à la place de
    Code:
    $db->sql_query($sql)
    dans le if qui ne doit pas manquer de suivre dans phpbb (l'idée est de suivre la même logique que le mod).

    Et c'est tout, faire cela cachera la requète dans le cache qui sera vidé si un post est posté ou modifié.

    Après je me demande si l'ensemble du cache est concerné ou si seul les requètes concernés sont vidées, faut faire des petits tests pour savoir (pas eu le temps).

    En suivant cette logique, qui est donnée par l'auteru du mod, j'ai pu cahcé pas mal de requète de mod, comme celle des dernièrs message sur ma home (construction construction ...).

    Voilà, j'en sais pas plus. Faut trouver ou est faite la sql du post et tenter le coup sur un forum test bien sur.

    ++
     
  7. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    668
    J'aime reçus:
    0
  8. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    Voilà, j'ai promis de publier mon nouveau système de mise en cache de pages, alors je le fais ! C'est une évolution du système publié dans ce sujet qui utilise des fichiers XML avec comme avantages:

    - la séparation du contenu et de la mise en page
    - la diminution du nombre de fichiers caches (réduction de 70% dans le cas de mon site)
    - un gain de ressources serveur mesuré globalement à 25% pour mon site

    Je prendrais comme exemple une page de liste de news ; chaque new de la liste comprend :

    - un titre (champ Titre dans la bdd formet texte)
    - une date (champ Date de la BDD format yyyy-mm-dd)
    - un auteur (champ Source de la bdd format texte)
    - un résumé (champ Texte de la bdd format texte)
    - une url (champ Url de la bdd format texte)

    pour faire simple, la page html affichera 10 news par page et contiendra un système de navigation par page (suivant, précédant, page 1….n). Le premier appel de la page génére un fichier XML à partir de la bdd, les appels suivants utilisent le fichier XML.

    L'url de la page est du type -http://www.exemple.com/news-xxx.html
    Les fichiers XML sont stockés dans le répertoire XML sous la forme /xml/news-xxx.xml ou xxx est le numéro de page

    Voici le code du script php de génération du XML appellé xml.php qui recoit en paramétre la page dans la variable page. Les pages sont numérotés de 1 à n.

    note: je n'ai commenté que ce qui me semblait nécessaire. Toutes les réponses à vos questions sont surement déjà dans ce topic trés fourni! :wink:

    Code:
    <?php 
    if (file_exists("/chemindepuislaracine/xml/news-".$_GET['Page'].".xml")===false) { //si le fichier n'existe pas
    	header("Content-Type: text/xml");  //on précise que le contenu est au format xml
    	// mettre ici le code de connection à la bdd
    	$start=($_GET['Page']-1)*10; // calcul de la première news à lire
    	ob_start(); // ceux qui ont lu le post connaissent cette fonction
    
    	// on compte le nombre total de news de la bdd
    	$query_news = 'SELECT Date FROM news order by Date DESC';
    	$new = mysql_query($query_news, labasededonnées) or die(mysql_error());
    	$row_news = mysql_fetch_assoc($news);
    	$countPages=mysql_num_rows($lastfiches);
    
    	// on récupére les 10 news de la bdd à partire de la première news à lire
    	$query_news = 'SELECT * FROM news order by Date DESC limit '.$start.',10';
    	$new = mysql_query($query_news, labasededonnées) or die(mysql_error());
    	$row_news = mysql_fetch_assoc($news);
    	if(mysql_num_rows($news)!=0) { // on verifie qu'il y a bien des news
    		// on commence la génération de notre fichier XML
    		echo '<'.'?xml version="1.0" encoding="iso-8859-1"?'.'>'.chr(13);
    		echo '<news>'.chr(13);
    		echo '<total>'.$countPages.'</total>'.chr(13); // nombre total de news de la bdd
    		do {
    			echo'<actualite>'.chr(13);
    			echo chr(9).'<date>'.date("d-m-Y",strtotime($row_news['Date'])).'</date>'.chr(13);
    			echo chr(9).'<titre>'.$row_news['Titre'].'</titre>'.chr(13);
    			echo chr(9).'<texte>'.$row_news['Texte'].'</texte>'.chr(13);
    			echo chr(9).'<source>'.$row_news['Source'].'</source>'.chr(13);
    			echo chr(9).'<url>'.$row_news['Url'].'</url>'.chr(13);
    			echo'</actualite>'.chr(13);
    		} while($row_news = mysql_fetch_assoc($news));
    		echo '</news>'.chr(13);
    	}
    	mysql_free_result($news);
    	mysql_close(labasededonnées);
    	// maintenant on prépare l'ecriture du fichier XML en se connectant en ftp
    	$conn_id = ftp_connect(adresseftp);
    	$login_result = ftp_login($conn_id, loginftp, passwordftp);
    	@ftp_mkdir ( $conn_id, "/chemindepuislaracine/xml"); // si le dossier xml n'exista pas on le créé
    	@ftp_site ($conn_id, "CHMOD 777 /chemindepuislaracine/xml"); // on lui donne les droits nécessaires
    	$contenuCache = ob_get_contents(); // on recupère notre contenu XML
    	ob_end_flush();
    	 // maintenant on créé le fichier XML et on y écrit notre liste de news
    	$fd = fopen("/chemindepuislaracine/xml/news-".$_GET['Page'].".xml", "w");
    	if ($fd) {
    		fwrite($fd,$contenuCache);
    		fclose($fd);
    	}
    	// on n'oublie pas de restraindre les droits d'accés au dossier XML et de fermer notre connection ftp
    	@ftp_site ($conn_id, "CHMOD 755 /chemindepuislaracine/xml");
    	ftp_quit($conn_id);
    } else {
    	// si le fichier XML existe, on l'ouvre
    	header("Content-Type: text/xml");
    	header("location: http://www.exemple.com/xml/news-".$_GET['Page'].".xml");
    }
    ?>
    Maintenant, voyons comment utiliser tout cela dans notre page html générée à partire du fichier news.php:

    Code:
    <?php
       if(isset($_GET['Page'])) $Page=$_GET['Page']; else $Page=1; // par defaut la page 1
       $fichier_xml = "http://www.exemple.com/news-<?php echo $Page;?>.xml"; 
       // on ouvre le fichier XML et on le parse
       $file = fopen($fichier_xml,"r");
       if ($file) { 
          while (!feof($file)) $raw .= fread($file,32000); 
          fclose( $file ); 
          if(eregi("<news>(.*)</news>",$raw,$rawitems)){ 
             eregi("<total>(.*)</total>",$rawitems[1], $compteActu); 
             $totalActu=$compteActu[1];
             $actus = explode("<actualite>", $rawitems[0]); 
             for ($i=0;$i<count($actus);$i++) { 
                eregi("<date>(.*)</date>",$actus[$i+1], $dateActu[$i]); 
                eregi("<titre>(.*)</titre>",$actus[$i+1], $titreActu[$i]); 
                eregi("<texte>(.*)</texte>",$actus[$i+1], $texteActu[$i]); 
                eregi("<source>(.*)</source>",$actus[$i+1], $sourceActu[$i]); 
                eregi("<url>(.*)</url>",$actus[$i+1], $urlActu[$i]); 
            }
          $cptActu=$i-1;
       } 
    }
    ?>
    <html>
    <head>
    <title>News page </title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    
    <body>
    <span> 
    <?php if($Page > 1) { ?>
       <a href="http://www.exemple.com/news-<?php echo $Page-1;?>.html">précédent</a>
    <?php } else { ?>
       precedent
    <?php } ?>
    <?php for($i=0;$i<ceil($totalActu/10);$i++) { ?>   
    	<a href="http://www.exemple.com/news-<?php echo $i+1;?>.html"><?php echo $i+1;?></a>
    <?php } ?>
    <?php if($Page < ceil($totalActu/10)) { ?>
       <a href="http://www.exemple.com/news-<?php echo $Page-1;?>.html">suivant</a>
    <?php } else { ?>
       suivant
    <?php } ?>
    </span>
    <?php for($i=0;$i<$cptActu;$i++) { ?>
    <li>
       <?php echo $dateActu[$i][1];?>: <?php echo $titreActu[$i][1];?><br>
       <?php echo $texteActu[$i][1];?><br>
       source: <?php echo $sourceActu[$i][1];?> - <a href="<?php echo $urlActu[$i][1];?>">lire l'article</a>
    </li>
    <?php }?>
    </body>
    </html>
    Bien entendu, dans le htaccess il faut mettre:

    Code:
    RewriteRule ^news-([0-9]+)\.html$ /news.php?Page=$1 [QSA,L]
    RewriteRule ^xml/news-([0-9]+)\.xml$ /xml.php?Page=$1 [QSA,L]
    remarque: publier un poste de ce genre prend environ 1 heure. Alors soyez indulgeant et si j'ai fait des erreurs de code, merci de les signaler. Eviter de porter des commentaires sur les cotés annexes du code qui n'est donné que comme exemple.

    Aller, a vos claviers! :D

    j'ajoute pour ceux qui seraient tentés d'utiliser cette technique:
    Pensez la solution globalement. Un fichier XML pouvant servir à plusieurs pages de votre site si l'ensemble est pensé de façon cohérente. L'un des interets de la solution et qu'il n'y a plus forcement un fichier en cache par page!
     
  9. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    668
    J'aime reçus:
    0
    Encore une fois bravo ;)
     
  10. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    tu as tout lu en 3 minutes! 8O

    moi, cela m'a pris 1 heure à tout rédiger :cry:
     
  11. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    668
    J'aime reçus:
    0
    Et yep, mais je t'avous ne pas avoir testé le code ;)

    Juste, je trouve que le genre d'initiatives que tu prends est eccelente, car je suis persuadé qu'un bon systeme de cache permet, en plus que d'accélerer le temps de génération de pages, d'ajouter des fonctionnalités à nos site qui sans cache, nous ralentierait un peut trop. Et plus de fonctionnalité, c'est important.

    Pour le reste, j'ai suivit ce topic depuis un moment, et je sais que tu code bien donc, 3 min c'est ce qu'il faut pour te dire bravo, en t'ayant lu tout de même, mais j'ai sauté la case testage de ton code, car je te fais confiance, même s'il y a un tit bug (et c pas sure) ton systeme ne peut que marcher si tu le propose donc ...

    Et pis, il faut croire que j'ai reçu le mail hyper vite aussi ;)

    ++

    PS : toi il t'as fallu que 2 min, mais c normal ;)
     
  12. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    va falloir demander à olivier de publier une toplist des réponses les plus rapides à un post! :lol: :lol: :lol:

    Teste quand même le code car le principe marche sur mon site mais j'ai fait une transcription, je garde quelques astuces pour plus tard éh:hé!hé :wink:
     
  13. dcz
    dcz WRInaute impliqué
    Inscrit:
    2 Mars 2005
    Messages:
    668
    J'aime reçus:
    0
    héhé, un autre pour le record ;)

    Donc, oui, j'y pense à le tester, mais je doit t'avouer que c'est pas pour tout de suite, car je suis en plein codage (mod rewrite et SEO) d'un portail basé sur phpbb, et j'utilise donc le systeme de cache sql de phpbbstyles.com comme base.

    J'ai de bon résultats d'ailleurs, je divise en moyenne par deux le nombre de requètes sur tout le portail, ce qui à pour effet de grandement diminuer la charge serveur (je suis sur un dédié), l'utilisation de la ram, et donc le temps de génération de pages en général.

    quand tout sera finit, je posterai un ti lien ;), mais c'est du .eu, donc pas avant avril pour la mise en ligne.

    ++
     
  14. Anonymous
    Anonymous Guest
    Pour en revenir à ton premier bout de code (sans xml), je me suis apercu que si le premier visiteur qui affiche une page non cachée (donc qui va créer le cache de cette page), clique sur un lien avant que la page ne soit complétement chargée, le fichier cache est vide (0ko).

    alors j'ai rajouté cela :
    (@filesize($fichierCache) == 0) dans le if
    ce qui donne :

    Code:
    	$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/03cache".$urldemandee; // on construit le chemin du fichier cache de la page
    	if ( (@filemtime($fichierCache)<time()-(3600*24*360)) || (@filesize($fichierCache) == 0) ) { //si la page n'existe pas dans le cache ou si elle a expiré ou si le fichier cache n'est vide
    	   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
    
    voilà

    merci encore pour ton code qui soulage bien mon dédié...
     
  15. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 743
    J'aime reçus:
    0
    Je me permet d'indiquer que j'ai créé un post qu'en à l'utilisation intensive de la mise en cache des pages PHP.

    N'hésitez pas à me donner vos avis.


    En passant je vient de voir qu'une nouvelle version de mise en cache vient d'être crée.
    Je vais voir tout ça. Merci d'avance fandecine.
    (ton avis sur le post ci-dessus me serait plaisant)
     
  16. thierry8
    thierry8 WRInaute accro
    Inscrit:
    11 Juillet 2005
    Messages:
    2 743
    J'aime reçus:
    0
    ****************
     
  17. BenSky
    BenSky Nouveau WRInaute
    Inscrit:
    2 Avril 2006
    Messages:
    2
    J'aime reçus:
    0
    Bonjour tout le monde.

    J'ai quelques (pas mal) de problèmes pour adapter ce script pour mon site.

    Enfin je ne comprend pas tout.

    La structure de ma page se présente de la façon suivante :
    -1-
    Les requêtes allants chercher toutes les informations nécessaire dans la base SQL, avec quelques conditions pour pouvoir afficher correctement dans la page plus tard.

    -2-
    Début de la page approprement dite : <html><body>...
    Un peu de design

    -3-
    Le cadre principal de ma page où j'affiche toutes les informations récupérées dans ma base.

    -4-
    La de ma page avec le reste de design.


    Le hic c'est que je ne sais pas du tout ou insérer le code de mise en cache par rapport à ma structure.

    Toute aide est la bienvenue.
     
  18. kiathos
    kiathos Nouveau WRInaute
    Inscrit:
    4 Décembre 2004
    Messages:
    1
    J'aime reçus:
    0
    Bonjour,

    Si tu as des soucis a adapter ce script. Tu peux utiliser des outils robustes et gratuit.

    Si tu a besoin d'un cache total : Jpcache est une tres bonne solution. (installation d'un cache total tres simple)

    Si tu veux pouvoir mettre en cache des parties de page, tu peux utiliser pear cache lite

    Si tu as besoin de quelques chose separant le design et la mise en forme et gerant un cache, tu as smarty. (attention, c'est un peu plus decliquat a utiliser)
     
  19. BenSky
    BenSky Nouveau WRInaute
    Inscrit:
    2 Avril 2006
    Messages:
    2
    J'aime reçus:
    0
    Oki, merci bien.

    Je vais rechercher un peu tout ca et je prendrai celui qui correspond le plus à mes besoins.
     
  20. tophus
    tophus WRInaute discret
    Inscrit:
    12 Août 2005
    Messages:
    192
    J'aime reçus:
    0
    Bonjour,

    Je suis en train de tester un sysytème de mise en cache, de page dynamique, ca marche très bien, par contre je ne sais pas comment gérer certaines pages qui on un espace perso.
    Si une personne se log, et se promène sur le site, il y a des pages qui sont mise en cache avec sa session, en fait, je pense qu'il n'est pas possible de metre en cache les pages contenant un espace perso, ou alors faire un système "si logué" on ne lit pas le cache. Je me trompe??
     
  21. radiotrance
    radiotrance WRInaute discret
    Inscrit:
    10 Juillet 2005
    Messages:
    124
    J'aime reçus:
    0
    Grand merci pour le script de mise en cache, je suis en train de faire une page qui parse 2 fichiers rss distant et du coup grâce au cache je n'ai plus a refaire les opérations a chaque visite de la page.

    Mon correspondant gagne en ressources, moi aussi, mais surtout le temps de chargement est minime, et ça c'est le top.

    En tout cas merci pour tes astuces c'est sympa de faire partager.
     
  22. david96
    david96 WRInaute passionné
    Inscrit:
    28 Août 2005
    Messages:
    1 205
    J'aime reçus:
    0
    C'est marrant j'ai mis un système dans ce genre y'a pas longtemps à cause justement des connexions multiples dans la base ! :(

    Un grand merci à toi fandecine, pour le partage de ton script ! :respect:

    Sinon j'ai lu ici où là que c'était surtout pour les dédiés... C'est marrant j'aurais dis le contraire !

    Sachant justement que les mutualisés brident le nombre des requêtes (en général une dizaine simultanées, voir moins)... La mise en cache ne peut être que bénéfique ?

    Sinon pour la mise à jour du cache, j'opte plus pour la fonction unlink() :D
    Du genre :

    Code:
    function miseAjour($doc)
    {
    // l'attribut $doc sera le fichier éventuel qui a été mis en cache
    	if(file_exists($doc))
    	{
    		echo "le fichier <b>".$doc." a été supprimé</b><br />\n";
    		unlink($doc);
    	}
    	else
    	{
    		echo "le fichier n'existe pas il vient d'être créée en cache<br />\n";
    	}
    }
    Voilà ensuite il suffit simplement d'appeler cette fonction avant la requête de modif ou d'ajout correspondant !

    :D

    edit : Ha oui une chtite reco. s'impose !
     
  23. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    j'ai un problème en utilisant ce script :cry:

    Le cache est bien créé mais lorsque je veux visualiser de nouveau la page (une fois le cache créé), voici le message que j'ai :

    Code:
    Parse error: syntax error, unexpected T_STRING in /home/sciencee/www/essai/cache-definition-science-1.html on line 1
    Je ne comprend pas du tout
     
  24. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    En fait je viens de comprendre :

    J'ai cela en début de page :
    Code:
    <?xml version="1.0" encoding="iso-8859-1"?> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    ceci
    Code:
    <?xml version="1.0" encoding="iso-8859-1"?> 
    est interprété comme étant du PHP :cry:

    En l'enlevant cela résoud tout
     
  25. Ohax
    Ohax WRInaute accro
    Inscrit:
    5 Juillet 2004
    Messages:
    4 920
    J'aime reçus:
    0
    LOL

    OSEF

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> suffit amplement :)
     
  26. mijsoot
    mijsoot Nouveau WRInaute
    Inscrit:
    12 Octobre 2005
    Messages:
    48
    J'aime reçus:
    0
  27. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 075
    J'aime reçus:
    0
    J'utilise intensivement ce script sur l'ensemble de mes sites, encore merci. :)
     
  28. mijsoot
    mijsoot Nouveau WRInaute
    Inscrit:
    12 Octobre 2005
    Messages:
    48
    J'aime reçus:
    0
    Bonjour à tous,

    Juste un petit mot pour dire que je ne sais pas pourquoi (ils ne m'ont pas prévenu par email) mais journaldunet a enlevé mon post où il y avait la correction de leur fichier.

    Toujours est-il que j'avais fait des fichiers de corrections, les voici :

    http://www.1max2web.com/cache_php/listing_1.html
    http://www.1max2web.com/cache_php/listing_2.html
    http://www.1max2web.com/cache_php/listing_3.html
    http://www.1max2web.com/cache_php/listing_4.html
    http://www.1max2web.com/cache_php/inc_cache.html

    Ils n'ont pas dû aimer mon post :oops:

    Pour les explications c'est toujours par là http://developpeur.journaldunet.com/tutoriel/php/050131-php-directionphp-cache-1.shtml que cela se passe ...
     
  29. ShePaKoiFer
    ShePaKoiFer Nouveau WRInaute
    Inscrit:
    17 Octobre 2003
    Messages:
    12
    J'aime reçus:
    0
    Bonjour,

    Je me permet de faire remonter ce topic, avec peut etre une idée pertinante, à vous de me le dire.

    Le point noir de ce script est l'effacement automatique des pages en cache.

    Admettons que par la premiere visite de la page, le visite provoque la mise en cache. Ceux qui visiterons cette meme page ultérieurement bénéficirons de la page en cache. Mais si il y a modification de cette page, on restera alors sur la premiere version. Alors pourquoi ne pas comparer la page qui est en cache avec celle où se trouve le visiteur.

    J'ignore peut etre que la comparaison serait très lourde niveau ressource serveur, mais au moins ca automatisement le refraichissement du cache.

    Nous pouvons également rajouter un compteur de hit avant comparaison de la page et interpoler cette condition avec la condition du temps comme c'est acquis sur le script.

    Autre chose, une page de mon site se compose de la facon suivante :
    1 fichier php pour le haut de page
    1 fichier php pour le pied de page

    et entre les deux, le contenu de la page.

    La problématique est que le script de ce topic est en deux partie. Si je met la premiere partie sur le "haut de page" et la seconde en "pied de page" j'hérite évidement d'une erreur (car la conditon dans la premiere partie reste en suspend).

    Si tu avais une solution de type jpcache (ou l'on appel la page contenant les fonctions necessaire à mettre la page en cache) à me proposer je t'en serais reconnaissant.

    Sinon félicitation pour ce script, cela m'a permis d'y voir plus clair dans le codage d'un système de cache et surtout d'y apprendre de nouvelle fonction.

    Cordialement,
     
  30. mijsoot
    mijsoot Nouveau WRInaute
    Inscrit:
    12 Octobre 2005
    Messages:
    48
    J'aime reçus:
    0
    Salut ShePaKoiFer,
    En fait je ne raisone pas comment cela pour le changement de contenu, je vois ça du côté administration. A chaque changement de contenu je supprime le cache correspondant comme le prochain internaute aurra bien la dernière version.J'ai aussi un script en admin pour effacer tout le cahce (au cas où). Aprés cela dépend beaucoup du type de site et de la fréquence de rafraichissement du contenu je pense.

    Sinon je ne comprends pas trop ton problème par rapport à tes includes, parce que le script est fait en sorte justement (si tu le place en haut de tous tes includes et de ta page) de ne pas executer le reste du code si il trouve la page en cahce et sinon il execute la page et la met en cache.

    Enfin je ne sais pas si je réponds à ta question ou si j'ai mal compris, n'hésites pas si c'est le cas :lol: .

    A +
     
  31. ShePaKoiFer
    ShePaKoiFer Nouveau WRInaute
    Inscrit:
    17 Octobre 2003
    Messages:
    12
    J'aime reçus:
    0
    Cet action est automatique ?
    Tu met à jour ta base de donnée qui par conséquence efface ton fichier cache corresponsant
    OU
    Tu accède à ton repertoire cache par ton panel d'administration et tu efface maneul le fichier cache ?


    Je viens de trouver la solution en t'exposant le problème en détail :)
     
  32. radiotrance
    radiotrance WRInaute discret
    Inscrit:
    10 Juillet 2005
    Messages:
    124
    J'aime reçus:
    0
    Perso moi c'est dans le script, chaque fois qu'un commentaire et posté ou que le contenu de la page a changé, connaissant le nom du fichier cache, ca se surprime tout seul en faisant un petit unlink().
     
  33. mijsoot
    mijsoot Nouveau WRInaute
    Inscrit:
    12 Octobre 2005
    Messages:
    48
    J'aime reçus:
    0
    Oui pour moi c'est aussi automatiquement, mais ce n'est effectivement pas grand chose comme le dit radiotrance juste un unlink sur le fichier correspondant !!!

    Voilou voilà, donc en fait il n'y a aucun problème quoi ! :lol:
     
  34. Ryoh
    Ryoh Nouveau WRInaute
    Inscrit:
    1 Novembre 2005
    Messages:
    6
    J'aime reçus:
    0
    Bonjour,

    J'ai testé le code, le souci c'est que je sais pas si ça fonctionne... j'ai rafraichi la page, dur de savoir si ça va plus vite...

    j'ai un dossier cache avec un fichier cache-index.php à l'intérieur.. ça veut dire que ça fonctionne ou pas ? parce que sur la page d'accueil, j'ai toujours l'url du site en index.php et non pas index.html
     
  35. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    Le gain en rapidité n'est pas le but de ce script, bien qu'il puisse être important pour une page avec de grosses requêtes SQL. L'objet du script est d'éconnomiser les ressources du serveur.

    Je pense que tu mélange l'utilisaton de ce script avec l'url rewriting ! :wink:

    Mais si tu as des fichiers qui se créent dans le dossier cache, cela prouve que la mise en cache fonctionne. Pour vérifier que l'utilisation du cache fonctionne, fait une modif (légère!) dans ton index.php. Si elle n'apparait pas lorsque que tu visionne la page, c'est que le fichier en cache est bien utilisé!
     
  36. mijsoot
    mijsoot Nouveau WRInaute
    Inscrit:
    12 Octobre 2005
    Messages:
    48
    J'aime reçus:
    0
    Bonjour,
    Bon pour voir si cela fonctionne c'est simple il suffit de mettre (dans le fichier inc_cache.php) define ("DEBUG_TIME", false); à TRUE et tu auras un timestamp en bas de page, par contre pour le voir rapidement il faut changer define (CACHE_TIMEOUT, 24*60*60); par define (CACHE_TIMEOUT, 60); pour une minute par exemple. Et donc en actualisant ta page tu verra que le timestamp ne changera pas pendant une minute et si il change ensuite c'est que cela fonctionne.
    Par contre je ne comprends pas ce que tu veux nous dire avec index.php et index.html, ce script ne joue pas le rôle d'URL_Rewriting donc cela ne change pas le nom des fichiers.
    Voilou, voilà, j'espère que cela t'aidera.
     
  37. Ryoh
    Ryoh Nouveau WRInaute
    Inscrit:
    1 Novembre 2005
    Messages:
    6
    J'aime reçus:
    0
    je suis allé sur phpmyadmin pour ajouter des données, et ça s'est pas affiché sur mon site, donc ok ça fonctionne.

    c'est la technique de mise en cache la plus simple que j'ai vu, merci !

    et je crois que je vais rester sur ce forum :D
     
  38. sdeplo
    sdeplo Nouveau WRInaute
    Inscrit:
    3 Mars 2007
    Messages:
    6
    J'aime reçus:
    0
    merci pour ce script vraiment très simple et efficace. Mais il me faudrait une optimisation pour mon site et débutante en PHP, je n'ai pas trouvé la bonne ecriture de ce qu'il me faudrait.

    Je n'ai qu'une page index.php sur mon site et le contenu change en fonction des variables qui se trouve derrière (index.php?art=45&part=rub). Sauf que certaines pages lors d'une recherche sur le site (index.php?part=recherch) sont mises en cache (formulaire en POST) et du coup lors d'une recherche, c'est la page mise en cache qui s'affiche donc pas les bons résultats pour les internautes suivants...

    De quel manière simple pourrait on exclure certaines URL du script pour ne pas utiliser les pages en cache quand l'URL contient "part=recherch" par exemple.

    Merci à vous, je ne sais pas si j'ai été claire.

    Quelque chose comme ça fonctionnerait-il?:

    if (@filemtime($fichierCache)<time()-(3600*24) && !strstr($urldemandee, "part=recherch")
     
  39. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 075
    J'aime reçus:
    0
    ou plutôt &&($_GET['part']!="recherch")
     
  40. sdeplo
    sdeplo Nouveau WRInaute
    Inscrit:
    3 Mars 2007
    Messages:
    6
    J'aime reçus:
    0
    merci pour la réponse. en fait j'ai fait comme ceci entre temps et ça semble fonctionner:

    if (@filemtime($fichierCache)<time()-(3600*2) || (@filesize($fichierCache) == 0)|| $rub=="recherch"

    par contre, un problème se pose si plusieurs pages non en cache sont appelés en meme temps, il y a une grosse surchage de la base SQL et là , la page mise en cache contient le fameux "too many connections" du coup elle s'affiche pour les autres utilisteurs après puisqu'elle est enregistrée.
    Quel serait la solution pour eviter ce problème?

    Merci par avance!
     
  41. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 075
    J'aime reçus:
    0
    tu testes tous tes appels sur mysql_quelque chose() et dès que l'un d'eux est faux, tu laisses tomber la génération de la page, pour afficher plutot la version en cache.
     
  42. sdeplo
    sdeplo Nouveau WRInaute
    Inscrit:
    3 Mars 2007
    Messages:
    6
    J'aime reçus:
    0
    "tu testes tous tes appels sur mysql_quelque chose() et dès que l'un d'eux est faux, tu laisses tomber la génération de la page, pour afficher plutot la version en cache."

    euh , je ne vois pas très bien comment faire... de manière temporaire j'efface systematiquement les fichiers HTMl générés de moins de 10 Ko (car toutes mes pages font plus)
    La page "too many connections" doit faire moins!

    (@filesize($fichierCache) <= 10000
     
  43. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 075
    J'aime reçus:
    0
    if(mysql_connect(....)) {

    //traitement

    }
    else
    {
    $recupererCacheCarPasDeConnexionSQL=true;
    }
     
  44. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    J'aimerai quelques renseignements complémentaires, si en utilisant le script de fandecine, dans ma page j'ai des liens staff, comme admin, ou editer etc.. comment je peux gerer ça ? car si c'est moi qui fait actualiser le cache, j'ai pas trop envie que les visiteurs s'amusent a cliquer sur les liens (meme si ca craint pas, vont se faire refouler), sinon inversement, si dans 99% des cas c'est un membre qui fait le refresh, je ne verrai plus mes liens d'administration ..

    Merci de m'éclairer ;)
     
  45. Patrice A.
    Patrice A. WRInaute passionné
    Inscrit:
    11 Février 2005
    Messages:
    2 075
    J'aime reçus:
    0
    Tu mets tes liens admin en-dehors de la partie en cache...
     
  46. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    Theoriquement c'est évident.. mais à appliquer pas forcement.

    Je m'explique :

    mon architecture actuelle est de type :
    Code:
    <?php
    include('header.php');
    
    // et ici le contenu different selon mes pages
    
    include('footer.php');
    ?>
    dans mon header j'ai le ob_start() et dans le footer j'ai le ob_end_flush(), donc comment reussir à isoler certaines parties de mon centre ?

    Merci
     
  47. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    mets du code qui génère du code php.
    Comme ça, même en cache il sera interprété à chaque fois.

    Evidemment, tu utilises ce code là pour détecter si tu es loggué en admin ou visiteurs.
     
  48. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    Je ne comprends pas la logique, passer du code php a du code php, pourrai tu m'en dire plus car je vois pas l'avantage.
     
  49. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    dans ton fichier php qui te sers de gabarit pour générer ton cache :

    Code:
    <?php 
    include('header.php'); 
    //là tous les machins qui sont pour tout le monde
    
    
    // regarde si tu es lechef :
    echo '<?php 
    if ($jesuislechef==true){
    
    }
    else {
    
    }
    ?>';
    
    include('footer.php'); 
    ?>
    De cette façon, le fichier cache devient :
    Code:
    les machins éventuels générés par le header lors de la mise en cache
    et là tous les machins qui sont pour tout le monde
    
    <?php 
    if ($jesuislechef==true){
    
    }
    else {
    
    }
    ?>
    //les machins éventuels générés par le footer
     lors de la mise en cache 
    
    Ainsi tu as certes une partie des choses qui ne sont pas vraiment en cache, mais si tu ne mets rien de couteux en ressources, c'est jouable.
     
  50. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    Merci de ton exemple, par contre en quoi je suis gagnant ? ca evite 2 includes ? moi c'est surtout pour eviter des reqs SQL.
     
  51. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Et bien ça permet de mettre tes parties réservées à l'admin en fonction de qui est connecté. N'est-ce pas ce que tu souhaitais ?
     
  52. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    Oui c'est un des souhaits que je souhaite, mais je ne vois pas de différence entre avant et après, mis à part le code des includes en dur. tout ce qui est req et boucle restent (ou j'ai pas pigé), alors que si j'avais un fichier généré, ce n'est QUE du texte d'ou le gain important.
     
  53. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Tu n'as pas pigé je crois :)
    Mais c'est pas grave, c'est pas forcément évident.

    Dans ton fichier qui va permettre de générer ton cache, tu laisses les instructions communes à tout le monde faire leur vie normalement. Et tu ne génère du code php que pour les parties qui doivent rester dynamiques.

    ex :
    le fichier qui va servir de modèle pour générer le cache :
    Code:
    <?php 
     jeSuisUneFonctionQuiVaPuiserDansMysqlEtQuiRenvoitEnEchoLesResultats();
    
    //la partie qui va rester dynamique :
    echo '<?php
    if ($chef){
    
    }
    else {
    
    }
    ?>';
    ?>
    Générera :
    Code:
    
    /* le contenu renvoyé par la fonction jeSuisUneFonctionQuiVaPuiserDansMysqlEtQuiRenvoitEnEchoLesResultats();
     et déjà généré lors de la mise en cache 
    */
    
    //la partie qui reste dynamique :
    <?php
    if ($chef){
    
    }
    else {
    
    }
    ?>
    
    Au final tu as une grosse partie de texte, avec un petit peu de php pour quand ya besoin.
    Après, le challenge c'est de te débrouiller pour ne pas coller des traitements lourds dans les trucs qui restent dynamiques (encore qu'une autre possibilité est de faire un double système de cache, l'un pour l'admin, l'autre pour les internautes).
     
  54. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
  55. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Pas franchement non.
    Mais peu importe, l'essentiel est que tu arrives à résoudre ton problème, d'une façon ou d'une autre.
     
  56. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    Roh... je dois être idiot de pas piger ton idée... tu aurais un exemple concret en situation réel ? avec des reqs Mysql. etc.
     
  57. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    J'avais rédigé un truc. Mais en fait ça ne va te servir à rien (cf en bas du message). J'ai beaucoup de mal à pouvoir m'exprimer mieux sur ton problème sans justement te filer un code entièrement fonctionnel. Ce qui aura peu d'utilité pour comprendre de quoi on parle : si ce que j'exprime n'est pas clair, j'ai peur que la lecture du code ne le soit pas plus.

    L'idée que je voulais faire passer était qu'il est possible de conserver des portions dynamiques de codes, malgré un système de cache. De beaucoup de façons évidemment, mais j'en donnais une particulière.
    A partir de là, le problème de cache admin/internaute peut être résolu.

     
  58. Kijer
    Kijer WRInaute discret
    Inscrit:
    9 Septembre 2006
    Messages:
    109
    J'aime reçus:
    0
    J'ai pigé l'utilité (grand pas déjà :D) mais question il faut que je me fasse une fonction pour chaque req :/ ? oh l'horreur
     
  59. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Bien sûr que non :) J'ai mis un exemple, mais tu peux mettre virtuellement n'importe quel code que tu souhaites.
     
  60. yackphoto
    yackphoto Nouveau WRInaute
    Inscrit:
    26 Avril 2007
    Messages:
    3
    J'aime reçus:
    0
    :( J'ai deux soucis avec votre script de mise en cache(celui de la première page de ce topic...). Il faut dire que je me suis mis à Php récemment pour améliorer mon site, et que je pratique en "amateur", donc j'apprends au fur et à mesure. (Comme je débute, j'ai pris Php5, mysql, Apache)
    Voici les 2 soucis:
    1) Quand j'essaye chez moi ça marche mais chez mon hébergeur LWS j'ai un message me disant qu'il ne connais pas la variable $_SERVER['REQUEST_URI']. Voici le message d'erreur: Undefined index: REQUEST_URI] . Excusez mon ignorance, mais vous, vous savez sûrement d'où ça vient?

    2) Cette fois-ci, chez moi, quand j'essaye de mettre en cache un fichier de la forme monfichier.php?id=102 Apache me répond:
    [client 127.0.0.1] PHP Warning: fopen(cache/cache-xxyyzz.php?id=102) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Invalid argument in W:\\var\\www\\xxyyzz.php on line 253.
    Et à la ligne 253, il y a ça:
    $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
    (je n'ai pas essayé chez l'hébergeur)
    ...Il ne peut pas l'ouvrir parce que le fichier cache n'a pas été créé dans ce cas.... alors que ça marche sans le ?id=102
    Merci de me mettre sur la (bonne) piste!
     
  61. yackphoto
    yackphoto Nouveau WRInaute
    Inscrit:
    26 Avril 2007
    Messages:
    3
    J'aime reçus:
    0
    J'ai trouvé (sur internet) une parade pour contourner le premier problème, en ajoutant ça au début:
    Code:
    if (!isset($_SERVER['REQUEST_URI']) && isset($_ENV['REQUEST_URI'])) {
    $_SERVER['REQUEST_URI'] = $_ENV['REQUEST_URI'];
    }
    if (!isset($_SERVER['REQUEST_URI'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'].(isset($_SERVER['QUERY_STRING'])?"?".$_SERVER['QUERY_STRING']:"");
    }
    Mais bon, je ne sais pas pourquoi je suis le seul à devoir passer par là...

    Par contre, le second problème reste entier: il ne met rien en cache! On dirait bien que les deux problèmes sont liés...
     
  62. Misaki
    Misaki WRInaute discret
    Inscrit:
    16 Octobre 2006
    Messages:
    91
    J'aime reçus:
    0
    Bonjour,

    Ce topic est assez vieux , je ne sais pas si je vais avoir une réponse ...

    Est ce possible de " mettre en pause " le cache ?

    Car au milieu de ma page j'ais une partie qui change en fonction de la session ( en clair j'ais une petite partie en plein milieu de la page qui dois rester dynamique )

    J'ais essayé ceci :

    <?

    $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


    // contenus mis en page
    // blablabla
    // blablabla


    ob_end_flush();

    // partie au milieu de la page que je veux laissé dynamique
    // blabla

    echo $_SESSION['membre'];]

    ob_start();

    // fin du contenus mis en cache



    <?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
    }
    ?>



    mais ca ne fonctionne pas du tout ...


    quelqu'un a une idée pour mettre le cache en " pause " ?
     
  63. francecity
    francecity Nouveau WRInaute
    Inscrit:
    8 Juin 2005
    Messages:
    3
    J'aime reçus:
    0
    J'avais moi aussi une partie SESSION qui devait s'afficher uniquement pour chaque utilisateur concerné, et donc ne pas mettre en cache les infos de chaque utilisateur.

    La seule solution que j'ai trouvé pour le moment (et je l'ai fais aujourd'hui) c'est de déplacer ma partie "session" au dessus de la mise en cache. Je n'ais pas trouvé la solution pour stopper et reprendre le cache.
     
  64. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Je crois avoir donné une piste de solution (il y a en a plusieurs), plus haut dans le thread.
    Stocker en cache du code qui va s'executer.

    Par ex :
    si on cache une page qui contient ça :

    On pourra récupérer le cache de manière à ce que la commande php s'execute.
     
  65. Bh@Mp0
    Bh@Mp0 WRInaute discret
    Inscrit:
    18 Janvier 2005
    Messages:
    201
    J'aime reçus:
    0
    Non, la solution pour de tels trucs est de faire plusieurs fichiers de cache ... un pour la partie avant session, un pour celle après :)
     
  66. Misaki
    Misaki WRInaute discret
    Inscrit:
    16 Octobre 2006
    Messages:
    91
    J'aime reçus:
    0
    J'y ais pensé mais le script de cache donne le meme nom de page pour tout les partie du cache puisque ca viens de la meme page ( et donc le meme nom )
     
  67. Misaki
    Misaki WRInaute discret
    Inscrit:
    16 Octobre 2006
    Messages:
    91
    J'aime reçus:
    0
    J'ais relus plusieurs fois tes topics en haut , j'ais vraiment fait un effort pour essayer de comprendre .

    Ton histoire de faire un echo"<? code ?>"; vraiment ca me dépasse ...

    faire un echo de <? , ca va afficher <? , ca va rien executer ... nan je pige rien ... ><
     
  68. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Ca va stocker le résultat dans le cache, et la fois d'après où tu chargeras le cache ça va executer le code qui est dedans.
     
  69. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Alors :

    fichier php de base :

    Code:
    echo "<?php include 'machin.php'; ?>";
    Mise en cache >> le fichier cache contient :
    Code:
    <?php include 'machin.php'; ?>
    Affichage du cache >> le include s'execute et on a ce qui est dans machin.php qui s'affiche.
     
  70. nalrem
    nalrem WRInaute occasionnel
    Inscrit:
    6 Avril 2003
    Messages:
    351
    J'aime reçus:
    0
    Petit détail technique qu'il vaut peut etre mieux que j'éclaircisse : les fichiers cache doivent être en extension.php pour que le code qui est dedans s'execute, ou alors configurer le htaccess de façon à le faire.
     
  71. yackphoto
    yackphoto Nouveau WRInaute
    Inscrit:
    26 Avril 2007
    Messages:
    3
    J'aime reçus:
    0
    Bonjour,
    J'ai toujours le même problème:
    mettre en cache un fichier de la forme monfichier.php?id=102
    (voir mon message du 26 Avril)
    Apparemment, c'est le ? qui gène le fopen...
    Personne n'a une idée pour contourner ce problème ?
     
  72. Joe Le Mort
    Joe Le Mort WRInaute discret
    Inscrit:
    8 Août 2006
    Messages:
    188
    J'aime reçus:
    0
    vérifiez les droits d'écriture du fichier.
    Créez préalablement le dossier :wink:
     
  73. lothar
    lothar WRInaute passionné
    Inscrit:
    12 Juillet 2003
    Messages:
    1 084
    J'aime reçus:
    0
    Question idiote: pour les pages en cache, est-ce les scripts type XiTi sont quand même exécutés (je pense que oui puisque c'est du javascript, mais je préfère avoir confirmation). Ce serait facheux de perdre des stats de fréquentation...
     
  74. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    Bien sur que les scripts javascript sont exécutés
     
  75. lothar
    lothar WRInaute passionné
    Inscrit:
    12 Juillet 2003
    Messages:
    1 084
    J'aime reçus:
    0
    Merveilleux, un grand merci pour ce script que je vais essayer de mettre en place sur la plupart de mes pages.
     
  76. h4ni
    h4ni WRInaute occasionnel
    Inscrit:
    11 Juillet 2005
    Messages:
    429
    J'aime reçus:
    0
    Bonjour
    j'ai une partie dans le code de ma page qui affiche des statistiques (connectés en ligne , ...)
    comment faire pour ne pas mettre cette paertir du code dans le cache

    Merci de me repondre
     
  77. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    Ca faisait un bon moment que j'avais repéré ce post et m'étais dit qu'il me serait un jour fort utile. Il l'est maintenant : MERCI fandecine !!
     
  78. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    Pour répondre à h4ni et autres membres qui me contactent par MP, voici une adaptation du script qui permet d'avoir des parties de code d'une page non mis en cache.

    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 
    ?> 
    <!--debut 1-->
    [i]Premiere partie de votre page PHP ici[/i] 
    <!--fin 1-->
    Code que vous ne souhaitez pas mettre en cache
    <!--debut 2-->
    [i]Deuxieme partie de votre page PHP ici[/i] 
    <!--fin 2-->
    
    <?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à 
    		$file = @fopen($fichierCache,"r"); 
    		if ($file) { 
    			while (!feof($file)) $raw .= fread($file,32000); 
    			fclose( $file ); 
    			eregi("<!--debut 1-->(.*)<!--fin 1-->",$raw, $part1); 
    			eregi("<!--debut 2-->(.*)<!--fin 2-->",$raw, $part2); 
    		}
    		echo $part1[0];
    		?>
    		Code que vous ne souhaitez pas mettre en cache 
    		<?php
    		echo $part2[0];
    } 
    ?>
    L'exemple est donné avec une portion de code à ne pas "cacher", mais il est possible trés simplement, de multiplier ces portions de page :wink:

    En espérant que cela répond à toutes les questions qui m'on été posées.

    PS: J'ai relu les messages précédants et je précise que ce qui est mis en cache c'est du HTML en aucun cas du PHP !
     
  79. h4ni
    h4ni WRInaute occasionnel
    Inscrit:
    11 Juillet 2005
    Messages:
    429
    J'aime reçus:
    0
    Merci beaucoup , je vien d'essayer ca et ca marche tres bien
     
  80. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    J'aimerais mettre en place ce système de cache sur une page qui utilise des variables de sessions (non liées à l'utilisateur, elles me servent pour générer une image créée par une page php). J'ai essayé de faire ça avec le code que tu fournis dans ton dernier post fandecine, mais cela n'a pas marché (les variables de session n'ont pas été transmises - elles le sont bien sûr sans cache).

    J'ai fait ceci :

    Code:
    <?PHP
    session_start();
    
    $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
    ?>
    <!--debut 1-->
    [i]Premiere partie de votre page PHP ici[/i]
    <!--fin 1-->
    Code que vous ne souhaitez pas mettre en cache
    -> Mes variables de session et l'appel à l'image <img src=img.php>
    <!--debut 2-->
    [i]Deuxieme partie de votre page PHP ici[/i]
    <!--fin 2-->
    
    <?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à
          $file = @fopen($fichierCache,"r");
          if ($file) {
             while (!feof($file)) $raw .= fread($file,32000);
             fclose( $file );
             eregi("<!--debut 1-->(.*)<!--fin 1-->",$raw, $part1);
             eregi("<!--debut 2-->(.*)<!--fin 2-->",$raw, $part2);
          }
          echo $part1[0];
          ?>
          exactement le même code qu'entre <!--fin 1--> et debut 2.
          <?php
          echo $part2[0];
    }
    ?>
    Est-ce bien comme cela qu'il faut faire s'il te plait :- ?
     
  81. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    euh, je ne vois pas tes variables de session !? Tu les déclares ou ??
     
  82. yazerty
    yazerty WRInaute passionné
    Inscrit:
    19 Juin 2005
    Messages:
    1 240
    J'aime reçus:
    0
    entre fin1 et début 2 : "-> Mes variables de session et l'appel à l'image <img src=img.php>". Puis à la fin du code "exactement le même code qu'entre <!--fin 1--> et debut 2. ". J'ai un doute sur ce qu'on doit mettre dans cette partie d'ailleurs. On doit copier/coller le code qu'on a déjà mis entre fin1 et début 2 :-/ ?
     
  83. fandecine
    fandecine WRInaute passionné
    Inscrit:
    2 Avril 2005
    Messages:
    1 886
    J'aime reçus:
    0
    tes variables de session tu dois les déclarer juste aprés le session start.

    Pour le reste oui, le code doit être identique.

    Maintenant, il ne faut pas de code utilisant tes variables de session dans la partie mise en cache.
     
  84. mikaweb
    mikaweb WRInaute discret
    Inscrit:
    4 Juillet 2007
    Messages:
    162
    J'aime reçus:
    0
    Me semble avoir lu que ereg_replace ne serait plus fonctionnel avec PHP 6, quel fonction pourrait remplacer tout cela ?
    preg_replace ?

    Merci.
    Je vais surement utiliser ce système insésament sous peu :p
     
  85. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    D'autant que preg_replace est beaucoup plus rapide.
     
  86. Ohax
    Ohax WRInaute accro
    Inscrit:
    5 Juillet 2004
    Messages:
    4 920
    J'aime reçus:
    0
    Code initial à mettre à jour donc ?
     
  87. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
  88. petitchevalroux
    petitchevalroux WRInaute discret
    Inscrit:
    31 Mai 2006
    Messages:
    164
    J'aime reçus:
    0
    Je confirme que jpcache fait ça et beaucoup mieux meme puisqu'il gere aussi le last modified et les Etag et donc les 304 pour ceux qui ne savent pas ce que c'est http://www.mnot.net/cache_docs/.

    Je vous conseille vraiment de vous renseigner sur le sur le sujet des 304.

    Dernière chose
    Code:
    else { // le fichier cache existe déjà
    include ($fichierCache); // on le copie ici
    }
    Dites moi si je me trompe mais un readfile ne serait pas plus rapide et conseiller puisque le fichier de cache ne contient pas de php ??
     
  89. Misix
    Misix WRInaute discret
    Inscrit:
    5 Septembre 2005
    Messages:
    100
    J'aime reçus:
    0
    J'ai un petit soucis avec le script, la page est bien crée mais elle est vide...

    Je suis sur un serveur dédié OVH avec php5 , une fonction a activer ?
     
  90. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    Aucunement ; je suis dans le même cas que toi et tout fonctionne.

    ça doit être une erreur dans ton script
     
  91. Misix
    Misix WRInaute discret
    Inscrit:
    5 Septembre 2005
    Messages:
    100
    J'aime reçus:
    0
    Disont que le la page est crée et que je n'est pas d'érreur sur le site. mais quand je vais voir le ftp toutes les pages font 0Ko et quand je les télécharge puis ouvre elle sont vide...

    Quelqu'un a une idée?

    Le contenu serait mal copié ?
     
  92. medium69
    medium69 WRInaute passionné
    Inscrit:
    7 Mai 2005
    Messages:
    1 948
    J'aime reçus:
    3
    Le contenu à mettre en cache doit se trouver entre le script de mise en cache à un endroit bien précis.

    Je n'ai pas le temps de regarder tout de suite mais le problème doit venir de là.
     
  93. Misix
    Misix WRInaute discret
    Inscrit:
    5 Septembre 2005
    Messages:
    100
    J'aime reçus:
    0
    C'est ok, j'avais mal placé le code et la ça a marcher.

    J'avais pas lu les commentaire du script ça m'apprendra :)
     
  94. choubix
    choubix Nouveau WRInaute
    Inscrit:
    24 Août 2005
    Messages:
    6
    J'aime reçus:
    0
    hello,

    j'ai mis les 2 portions de codes sur mon site: une dans le header et l'autre dans le footer maius ca ne fonctionne pas.

    cela ressemble a cela:

    <?php
    $urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
    $urldemandee=preg_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)) { //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
    ?>

    <META NAME=" etcetc>



    et le footer


    <?php

    require("config.php");




    //extract google analytics' data and then display in the footer

    $query = mysql_query("SELECT google_analytics FROM admin")
    or die(mysql_error());

    while($row = mysql_fetch_array( $query ))
    {
    print $row['google_analytics'];
    }

    mysql_close();

    ?>


    <?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
    }
    ?>

    ca me retourne une belle page blanche.
    qd j'affiche la source ca me donne que 2/3 lignes de code qui s'arrete a <head>

    comment faire pour que lqa syntaxe fonctione svp??

    merci :)
     
  95. mathias59
    mathias59 Nouveau WRInaute
    Inscrit:
    18 Décembre 2005
    Messages:
    11
    J'aime reçus:
    0
    Le cache est limité à 1 an comment faire pour avoir un cache qui n'expire pas au bout d'1 an ?

    On doit remplaçer

    <time()-(3600*24*360)) par quoi?

    que correspond 3600*24*360 ?

    Minute*heure*jour ?
     
  96. h4ni
    h4ni WRInaute occasionnel
    Inscrit:
    11 Juillet 2005
    Messages:
    429
    J'aime reçus:
    0
    oui ;)
     
  97. Tempus
    Tempus Nouveau WRInaute
    Inscrit:
    23 Décembre 2007
    Messages:
    1
    J'aime reçus:
    0
    Bonjour à tous, j'ai lu le thread dans son entier et je suis tombé sur ce post qui n'a malheureusement pas vraiment reçu de réponses et qui m'interesse grandement:
    Je souhaite donc automatiser ma "remise en cache", l'idée avancée plus haut me semble bonne: comparer le fichier dans le buffer et celui mis en cache pour décider si on remet en cache ou pas.
    Mais voila je me pose les mêmes questions, ce traitement serait-il peut être trop lourd ? Comment faire la comparaison entre les données misent en cache dans le buffer et en dur dans le fichier ?

    Avez-vous peut être une autre solution pour automatiser cela ?

    Merci !

    PS: Je ne souhaite pas réaliser l'effacement des pages en cache pendant l'administration de mon site, bien que ca risque d'être ce que je vais faire si je ne trouve pas de manière "automatique".
     
  98. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 196
    J'aime reçus:
    1
    l'idée de comparer le contenu en cache avec un contenu 'd'actualité' supprime tout l'avantage du cache dans la mesure ou on retombe sur un traitement plus lourd (celui du cache / celui de la page dynamique).

    A mon sens, l'automatisation de la mise a jour d'un cache passe par une analyse des 'sources de modification du contenu'
    En identifiant les moments / cas d'utilisation, ou les données sont modifiées ou mise a jour, il deviens commode de supprimer automatiquement le fichier en cache pour qu'il soit régénéré a la prochaine visite de la page.
     
  99. stoff
    stoff WRInaute occasionnel
    Inscrit:
    22 Août 2004
    Messages:
    271
    J'aime reçus:
    0
    ou alors diminuer la durée de mise en cache.

    perso je remet à jour toutes les 5 minutes, les performances sont déja amplement suffisante.
     
  100. pierre_jean
    pierre_jean WRInaute occasionnel
    Inscrit:
    6 Avril 2005
    Messages:
    296
    J'aime reçus:
    0
    Que faut-il privilégier ? le cache fichiers ou mysql ?
     
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