[script] Mise en cache des pages PHP

  • Auteur de la discussion Auteur de la discussion fandecine
  • Date de début Date de début
Nouveau WRInaute
et si ce sont des milliers de pages qui sont mises en cache : est ce que le serveur ne risque t-il pas de chauffer plus rapidement à chercher des dates de création continuellement ?
 
WRInaute discret
Quel est la grande différence entre ce système et la sérialisation ? J'ai cru comprendre que la seconde était assez lourde et cette méthode là c'est lourd ou pas ?

Ce que je souhaiterais, c'est avoir la possibilité de mettre à jour mon cache automatiquement après avoir fait une modification, par exemple valider une news. Ainsi on update le cache pour bien dire que sa a changé et non le faire chaque 5 minutes ou haures ? Tiens au passage, sa se fait tout seul les 5 minutes ou seulement 5 minutes après le passage de quelqu'un sur la page ?


Y a-t-il moyen de faire avec ce système là, qui à l'air assez utilisé, un système qui update tout seul après divers actions ?


Merci ;)
 
Nouveau WRInaute
En connaissant le nom du ou des fichiers de caches, tu peux les détruire après X minutes, après une une mise à jour ou quand tu le veux...et donc fournir un contenu nouveau à tes visiteurs.
 
WRInaute accro
mikaweb a dit:
Ainsi on update le cache pour bien dire que sa a changé et non le faire chaque 5 minutes ou heures ? Tiens au passage, sa se fait tout seul les 5 minutes ou seulement 5 minutes après le passage de quelqu'un sur la page ?
as tu lu le code ?
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
si la page demandée n'existe pas dans le cache ou si elle a expiré (plus de 360 jours) alors on construit ce cache et on l'envoie au visiteur.

en conclusion :

mettre a jour le cache consiste simplement a détruire le fichier cache correspondant à la page (qui sera automatiquement reconstruit au prochain visiteur de la page). et dans tous les cas ça se fait tout seul tous les 360 jours.

3600*24*360 c'est le temps de 'survie' de la page en cache, 5 minutes ça ne sert a rien autant pas mettre de cache a moins d'avoir 2000 visiteurs qui passe sur cette page en 5 mn et qu'ils aient la possibilité de la modifier dynamiquement.
 
WRInaute discret
J'ai bien compris sa mais ce que j'aimerais c'est lorsque je fais une action, juste avant de rediriger, il me détruise la page en cache que je désire.

Mon but est que le système de cache ne fonctionne non pas en haure, jour, année mais simplement en fonction des actions des utilisateurs ainsi le traitement ne se fait que quand j'en ai réellement besoin.

J'ai réussi à mettre un système de la sorte avec la sérialisation mais on m'a dit que c'était lourd comme système.
 
WRInaute discret
Je me demandais si pour un espace c'était vraiment important en sachant qu'il y a au grand maximum une quinzaine de personne qui y ont accès ?

C'est plutôt utile pour un espace publique qui fait des milliers de pages vues par jours.
 
WRInaute accro
c'est utile par exemple si :
- une page est consultée souvent ou si beaucoup de pages sont consultées tout en nécessitent un traitement côté serveur non négligeable.
- si le contenu de la page nécessite de gros traitements (SQL, regex, autre ...)
- surtout si le site n'est pas statique (évident certe, mais a ne pas oublier)
- si la connexion a là base n'est plus disponible (et qu'aucun autre traitement SQL n'est nécessaire)

et surement pour d'autre raisons

maintenant pour 15 clampins qui traînent sur le site je ne suis pas certains que tu gagne en perf.
 
Nouveau WRInaute
Bonjour à tous,

J'utilise le même genre de script (le 1er posté) pour la mise en cache de l'un de mes sites. Ca fonctionne très bien mais j'aimerais apporter une "amélioration" (dans mon cas...).

En effet, le site en question est TRES lourd. Le temps d'affichage d'une page non en cache est d'environ 8 secondes, ce qui, je trouve, est énorme. Bien sûr, une fois cette page en cache, l'affichage est quasi-instantané.

(PS: j'ai opté pour une mise en cache car l'optimisation réelle (requetes SQL, jointures, index, moteur, etc...) est quasi-impossible (à moins de tout refaire...) ; le site utilisant un système de boucle gourmand pour la génération du template...

J'ai par ailleurs automatisé la destruction du cache (via unlink()) lorsqu'une mise à jour est réalisée dans le back-office.

Cependant, étant donné la lourdeur d'affichage des pages non en cache, j'aimerais automatiser également la remise en cache des pages (c'est à dire, sans attendre qu'un internaute visite ces pages).

Je cherche donc un moyen d'effectuer cette "remise en cache" automatiquement ; je suis ouvert à toute suggestion !

Pour ma part, je pensais qu'une sorte de robot (style robot d'indexation des moteurs de recherche) pouvait se charger de ce travail, en explorant toutes les pages du site automatiquement (en suivant tous les liens internes 1 seule fois par exemple...).

Je ne sais pas si c'est réalisable en PHP... mais dans ce cas, quel autre langage pourrait être utilisé ? (script shell, C ?)

Dites moi tout de suite si je fais fausse route ou pas ;)
D'ailleurs, peut-être existe-t-il déjà des sources / scripts de ce genre, ou bien qui correspondraient à ce que je souhaite, mais malgré mais recherches, je n'ai pas trouvé grand chose...

Si vous avez des idées, suggestions, scripts, docs, etc... je suis preneur !

Merci !


EDIT DU 14/05/2008 à 15h20 :

J'avance, j'avance...

Imaginons maintenant que j'ai une liste des pages à mettre en cache (donc les pages "à visiter" par le robot (ou autre chose...)) récupérée automatiquement, et sous la forme suivante :

Code:
http://www.mondomaine.com/mapage1.html
http://www.mondomaine.com/mapage2.html
http://www.mondomaine.com/mapage3.html
http://www.mondomaine.com/mapage4.html

etc...

Y a-t-il un moyen en PHP (ou autre : Shell...) de visiter "virtuellement" (c'est à dire sans les ouvrir vraiment) ces pages, afin de regenerer le cache de ces dernières ?
Je pense à l'utilisation de Sockets, ou quelque chose du genre... Quelqu'un a une idée ?

Important : j'ai environ 1300 pages à "visiter" (régénérer le cache) d'un seul coup, est-ce toujours possible en PHP (ou Shell, C, via un exec() de PHP...) ?

Merci


EDIT DU 15/05/2008 à 15h00 :

Finalement, j'ai tout réussi tout seul comme un grand :)

J'ai trouvé mon bonheur avec les fonctions CURL de PHP. Et ce script (chargé de régénérer le cache en "visitant" chaque page qui n'est pas encore en cache) et exécuté en ligne de commande toutes les 25 minutes à l'aide d'un cronjob). Impec' !

Merci quand même ;) Et @+
 
WRInaute accro
BaZouL a dit:
EDIT DU 15/05/2008 à 15h00 :

Finalement, j'ai tout réussi tout seul comme un grand :)

J'ai trouvé mon bonheur avec les fonctions CURL de PHP. Et ce script (chargé de régénérer le cache en "visitant" chaque page qui n'est pas encore en cache) et exécuté en ligne de commande toutes les 25 minutes à l'aide d'un cronjob). Impec' !

Merci quand même ;) Et @+

Je rêve ou tu prend la tête pour rien ?

si tu gère la destruction du cache avec unlink() après une mise a jour de celle ci tu peut tout autant le régénérer dans la foulée avec un fopen() de l'url ....
 
Nouveau WRInaute
zeb a dit:
Je rêve ou tu prend la tête pour rien ?

si tu gère la destruction du cache avec unlink() après une mise a jour de celle ci tu peut tout autant le régénérer dans la foulée avec un fopen() de l'url ....

C'est vrai que ça aurait pu être une bonne solution, (sans aucun doute moins prise de tête que la mienne ;)) mais dans mon cas ce n'était pas possible : les noms des fichiers en cache sont beaucoup trop transformés par rapport aux urls d'origine de mes pages, et c'est quasi impossible de retrouver l'url d'origine de la page à régénérer/recacher, par rapport au nom des fichiers en cache.

Aussi, lorsque je détruit le cache (après une mise à jour / modification dans le back office), c'est par centaines de fichiers, et donc si je régénère/recache les pages correspondantes aussitôt, l'opération prendrait beaucoup trop de temps...

C'est pour cela que j'ai choisi la solution du cron job. Comme ça, tout se fait en arrière plan, et l'utilisation du site (et en particulier du back office) par l'administrateur/webmaster n'est pas affectée / ralentie.
 
Nouveau WRInaute
Je viens de découvrir l'astuce PHP du
Code:
pclose(popen('/chemin/vers/script.sh&', 'r'));
pour lancer un script en processus (en tâche de fond, ce qui fait que l'utilisateur n'a pas à attendre la fin d'éxécution de ce script !) Vraiment très pratique, pour ne pas dire parfait, plus besoin de Cron Job avec ça !
 
WRInaute discret
prblème avec le cache

Je viens d'implémenter le code PHP que tu donnais dans l'un des topics pour mettre du contenu en cache.
Sur les pages "statiques" pas de soucis.
Cependant lorsque dans mes URL j'ai des variables (ex: monsite.com/page.php?cat=football&coupe=monde)
il ne met pas ma page en cache et le ressort l'erreur PHP suivante:

Code:
Code:
Warning: fopen() [function.fopen]: open_basedir restriction in effect. File(cache/-page.php?cat=football&coupe=monde) is not within the allowed path(s):


pour mémoire voici plus bas le code que tu donnais dans le topic. j'espère vraiment que tu pourra m'aider Smile

D'avance merci

Benjamin



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
}
?>
 
WRInaute accro
3600 : 3600 secondes/heure (60x60)
24 : heures/jour
360 : jours/an (environ...)

Tu mets seulement 3600 pour une heure.
 
Nouveau WRInaute
Bonjour,

J'aimerais savoir s'il est possible de modifier dans le script de la première page cette condition
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360))

Par une vérification de l'heure de création du fichier cache, je m'explique
1 ) on définit en début de code une heure ( exemple 3H du matin )
2 ) on ne recrée le cache qu'à cette heure définie ou au premier accès après cette heure définie et à aucun autre moment de la journée.
 
WRInaute discret
Salut, Est-ce si dans
Code:
[i]Votre page PHP ici[/i]
je mets toute ma page et qu'il y a de la pub dedans, y'aura-t-il un raffraichissement quand même des pubs ? ou comment separe pas t-on la pub du contenu php , pour ne pas mettre en cache la pub ?
Car c'est important de ne pas mettre tout en cache
Merci
 
WRInaute discret
Impeccable alors, c'est super ce code.
Donc je peux faire :
[ton code cache deb]
[mon pavé de php et autre javascript]
[ton code cache fin]

et donc les pages de pubs seront renouvellées ;) cool.
 
WRInaute passionné
Toutefois si tu utilises un script PHP de rotation des bannières, la mise en cache annulera cette "rotation" justement.

Un script comme OpenX par exemple propose plusieurs méthodes d'inclusions : si tu utilises la méthode "PHP", ça coincera. Mais si tu utilises la méthode full Javascript comme le dit fandecine il n'y aura pas de soucis.
 
WRInaute discret
Bonsoir à tous

Alors, voici moi petit soucis avec la mise en cache... J'essaie désespérement de l'implementer sur mon forum, basé sur Punbb.

J'ai essayé jpcache et j'ai essayé le script de fandecine.

Les deux marchent nickel, la page est bien crée, appelée et affichée au besoin. J'arrive à ouvrir et lire manuellement les fichier cache, et j'ai fait un echo($time) et tout est juste à ce niveau là aussi.

Le problème, qui n'est pas un détail, c'est que toutes les requêtes continuent à être effectuées, ce qui fait que le cache, du coup, il sert à rien :(

J'ai retourné ça dans tous les sens, je n'arrive pas à comprendre.

Pour ceux qui connaissent, j'ai essayé de placer le début de la mise en cache juste après l'appel à common.php dans les fichier index.php et viewforum.php, pour voir si ça marche en un premier temps, en affichant le cache que pour les visiteurs non connectés, histoire que je puisse mettre toute la page en cache sans devoir à ce stade jouer avec ce qui est visible pour tout le monde et ce qui est "membre connecté".
J'ai essayé de le mettre en tout début de header.php, même problème, toutes les requêtes sont effectuées.

Est-ce que quelqu'un peut me donner une piste, ne fusse que sur la théorie, ce qui fait qu'un script s'exécute malgré le fait qu'au final il pond la page mis en cache?
 
WRInaute passionné
Si le script s'exécute quand meme, cela veut dire que cette simple ligne :
Code:
 @filemtime($fichierCache)<time()-(3600*24*360)
ne fonctionne pas comme prévu.

donc fais des tests.
Code:
echo filemtime($fichierCache).'<br/>';
echo time()-(3600*24*360).'<br/>';
echo $fichierCache.'<br/>';

Recharge plusieurs fois la page et vérifie que les résultats sont cohérents.
 
WRInaute discret
j'ai consulté le post de Fandecine sur la mise en cache, c'est très interressant.
Ma question concerne spécifiquement phpBB, je souhaite mettre sur mon forum fréquenté (+10.000 post /mois), un espace sur les nouveautés que propose mon site.
Si je créer une page php (non dynamique) que j'inclus entre la banniere du haut et le debut des posts faut t'il que je la mette en cache?
 
WRInaute discret
Mbwo, il me semblait ourtant d'avoir répondu cette après... enfin...

Merci beaucoup Patrice.

J'ai essayé de nouveau avec le script de Fandecine et ajoutant ce que tu avait noté.
Et... c'est le boxon. Selon l'endroit ou je place le code de cloture du buffer, le fichier cache est ecrit ou pas (et je parle de avant ou après un include de footer, rien de spécial à priori. Par contre il est toujours lu.

Si il est affiché, ça me donne une page blanche, alors que le fichier cache, lui, contient toute l'info correctement.
Certaines query sont exectutées quand même, maintenant je suis en train de les tester une par une pour savoir lesquelles, si c'est vraiment celles en cache ou pas, parce que visiblement il teste la connection à la db d'office, même si il fait rien....

A mon avis, il doit y avoir quelque chose qui s'ouvre dans un fichier et se cloture dans un autre, mais avec les templates header footer et autre includes à la pelle, j'ai du mal à m'y retrouver. Je continuerait ça demain. Mais si quelqu'un a des idées...
 
WRInaute discret
bonsoir
est ce que la mise en cache des fichiers PHP peut provoquer des problémes au niveau de réferencement supposant qu'on va faire le mise à jour de ces fichiers par sémaine
 
WRInaute discret
Bonsoir a tous,

Je ne sais pas si cela a été cité. Mais smarty peut répondre a toutes vos questions. Le cache se gère au niveau template. Et il y a une mise en cache (Version html de la page). De plus smarty permet l'utilisation des balise {dynamic} ce qui permet ainsi de laissé dynamic une partie de la page comme un gestionnaire de bannière par exemple. ;)

J'espère que mon post n'est pas hors sujet.

Bonne soiré a vous tous
 
WRInaute discret
mitus a dit:
Bonsoir a tous,

Je ne sais pas si cela a été cité. Mais smarty peut répondre a toutes vos questions. Le cache se gère au niveau template. Et il y a une mise en cache (Version html de la page). De plus smarty permet l'utilisation des balise {dynamic} ce qui permet ainsi de laissé dynamic une partie de la page comme un gestionnaire de bannière par exemple. ;)

J'espère que mon post n'est pas hors sujet.

Bonne soiré a vous tous
Smarty est un moteur de template mais peut être que maintenant il fait aussi cache html, personnellement je ne connaissais pas cette fonctionnalité et je vois mal le rapport entre un moteur de template et un cache html mais pourquoi pas :D.
 
WRInaute accro
J'ai un petit souci, j'obtiens un Parse error: syntax error, unexpected $end in /home/site/www/cache-start.php on line 8...
Dans mon fichier PHP j'ai ça :
Code:
<?php
$mb_handle = fopen("feed.xml", "rb");
$mb_flux = '';
if (isset($mb_handle) && !empty($mb_handle)) {
while (!feof($mb_handle)) {
$mb_flux .= fread($mb_handle, 4096);
}
$mb_RSS2Parser = simplexml_load_string($mb_flux);
$mb_racine = $mb_RSS2Parser->channel;
foreach($mb_racine ->item as $mb_element) {
$video_id = $mb_element->id;
$video_nom = $mb_element->nom_video;
$video_titre = $mb_element->petite_description;
$video_description = $mb_element->longue_description;
$video_taille = $mb_element->taille;
$video_duree = $mb_element->duree;
$video_scene = $mb_element->scene;
$video_img = $mb_element->meilleur_thumb;
echo '<div class="post">
<h2><a href="video-'.$video_id.'.html">'.$video_titre.'</a></h2>
<p class="postinfo">Dur&eacute;e : '.$video_duree.' | Taille du fichier : '.$video_taille.'Mo | Nom de fichier : '.$video_nom.'.mpg</p>
<p><img src="http://images/'.$video_nom.'/'.$video_scene.'/'.$video_img.'.jpg" class="alignleft" alt="'.$video_titre.'" title="'.$video_titre.'" />'.$video_description.'</p>
</div>';
if($i == 49) break;
$i++;
} 	
}
fclose($mb_handle);
?>
Il doit y avoir quelque chose d'incompatible mais je n'arrive pas à bien comprendre...
 
WRInaute discret
petitchevalroux a dit:
mitus a dit:
Bonsoir a tous,

Je ne sais pas si cela a été cité. Mais smarty peut répondre a toutes vos questions. Le cache se gère au niveau template. Et il y a une mise en cache (Version html de la page). De plus smarty permet l'utilisation des balise {dynamic} ce qui permet ainsi de laissé dynamic une partie de la page comme un gestionnaire de bannière par exemple. ;)

J'espère que mon post n'est pas hors sujet.

Bonne soiré a vous tous
Smarty est un moteur de template mais peut être que maintenant il fait aussi cache html, personnellement je ne connaissais pas cette fonctionnalité et je vois mal le rapport entre un moteur de template et un cache html mais pourquoi pas :D.

Et oui smarty peut metre directement en cache ton html. Il fonctionne avec 2 niveau de cache. Le premier consiste a convertir tes templates (combinaison de html avec du pseudo code smarty) vers des fichiers combinant le php finalle avec le html. Et le 2 eme niveau de cache m'est tes pages html finaux en cache.
 
WRInaute accro
Audiofeeline a dit:
Serais-je invisible ? :cry:
Je vois pas du tout l'erreur pour la ligne 8 8O , une erreur du type c'est souvent pr une accolade fermante manquante mais ton script semble bon.

A tout hazard c'est pas l'espace en trop avant "->" ici:
Code:
foreach($mb_racine ->item as $mb_element)
?
 
WRInaute occasionnel
Audiofeeline a dit:
J'ai un petit souci, j'obtiens un Parse error: syntax error, unexpected $end in /home/site/www/cache-start.php on line 8...
...

Il semblerait qu'il manque une variable $end. Je ne vois pas cette variable dans ton code. Je vois que tu ouvres un fichier xml, l'erreur ne se situerait pas dans ce fichier ? Je dis ça parce que des fois quand j'ai une telle erreur c'est dans un autre fichier que je la trouve. En effet le numéro de ligne de l'erreur peut correspondre au numéro de ligne du fichier au complet c'est à dire si tu as fait appel à d'autres fichiers, par exemple un
Code:
<?php 
include('header.php'); // 20 lignes de code
/* ici j'ai 15 ligne de code */
include('envoie_mail.php'); // 50 lignes
etc....
?>
que tu as un Parse error à la ligne 15 ben il y a de forte chance que l'erreur se trouvera dans le header.php même si le Parse Error t'affiche ligne 15 du fichier tartempion.php (c'est ce que j'ai constaté).

Je ne sais pas si ça peut t'aider...
 
Nouveau WRInaute
Bonjour.
J'utilise ce script pour mon site et j'en suis très content. :wink:

Il y à juste une chose que je n'arrive pas à faire.
J'ai une page qui doit rester dynamique et je ne sais pas comment faire pour ne pas qu'il ne soit pas mis en cache.
Pourtant je sais que ça doit être facile mais bon, j'ai beau tester des if() ici et la, rajouter des parametres à
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360))
mais rien n'y fait.
Je suis pas un pro du php, loin de là, je me débrouille c'est tout mais cette fois, je crois que j'ai besoin d'aide. :(

Edit: C'est bon j'ai trouvé tout seul. :P
J'ai placé des if() au bon endroit :
Code:
if($page != "sitemap.html") {
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
   }
et
Code:
if($page != "sitemap.html") {
   $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);
               }
                                         }
 
Nouveau WRInaute
Juste comme ça, pour la suppression du cache utilisez plutot unlink !
plus court, plus rapide, plus léger que de faire des appel ftp à chaque fichier rencontré.

Et pour faire encore plus simple, on peut aisément remplacer ob_*
par file_get_contents en s'assurant bien sur de la validité des chemins des images,
(après tout dépend ou est placé le système de mise en cache)
quoi que.. y a toujours moyen de d'appliquer un petit str_replace avec http://...
 
WRInaute occasionnel
La méthode de kitten13 est sympa, par contre je suis embêté avec les membres.
La construction du cache se lance si la page n'existe pas ou si elle a expiré, malheureusement si c'est un membre qui créé le cache, et bien quand on regarde la page mise en cache on se retrouve avec son profil d'affiché sur la page. XD

En gros j'aimerai bien lancer le cache, qu'importe la personne (membre ou visiteur), je tenterai bien de lancer le cache après l'affichage du header mais si je le coupe avant la fin de ma page, le code 'normal' va reprendre sa route ?
 
WRInaute discret
Sinon une des solutions utilisées pour ton problème de membre c'est de faire la personnalisation des pages classique en JS et de ne pas cacher les pages trop personnalisé : Liste des articles de l'utilisateur ... Tout ce qui touche à de l'admin en gros.

Bon courage ;)
 
WRInaute occasionnel
Merci du conseil petitchevalroux. ;)
Je ne connais pas trop le JS, j'ai donc fait avec les moyens du bord.

Finalement vu que c'est une minorité de personnes (les membres) qui font vivre le site, je leur laisse le full acces 'en live' et pour tous les visiteurs sur les pages où ça ne change pas des masses ou qui consomme pas mal de ressource -> le cache.
 
Nouveau WRInaute
Bonjour,

le sujet est fermé depuis quelques temps mais j'aurai une question. Le système de cache est super mais dans une de mes pages je créé une image antispam classique mais du coup il me la met dans le cache...
Donc ce que je souhaiterai savoir c'est si on peut ne pas mettre une petite partie hors cache sachant que cette partie est entre les ob_start(); et le ob_end_flush();

Merci si quelqu'un voit ce message et peut y répondre.
 
Nouveau WRInaute
Regarde le manuel de la fonction ob_start() : http://php.net/manual/en/function.ob-start.php

Tant que j'y suis, j'ai une question : comment éviter la création intempestive de caches ? Je m'explique :
Nos pages mises en cache sont de la forme .../index.php?page=x avec x qui varie de 1 à n. La mise en cache doit se faire uniquement si la page existe. Il faut donc ajouter un test.

Le problème c'est que dans mon cas, je fais un test du style :

if($_GET[page] est correct)
on affiche la page
else
on affiche index.php?page=1

Le pb ici c'est qu'il y a tout de même création en cache de la page non autorisée par exemple avec x > n. Vous me direz de faire ce test avant le traitement du cache, mais le souci c'est qu'il doit se faire justement en cache, car je ne connais pas avant le nombre de pages.
Si quelqu'un a compris qq chose et à une solution, je suis preneur !!
 
Nouveau WRInaute
Bon, j'ai finalement trouvé une solution. J'avais tout simplement mal conçu le site. Sinon, si ça intéresse quelqu'un, j'ai mis en place un système de templates avec caches (ou sans cache). Le tout en MVC (Model, View, Controller) qui marche nickel.
 
WRInaute accro
@Furinkazan, un système de cache MVC ? Tu ne veux pas dire simplement un système de cache POO ? Car je vois pas comment du cache peut être MVC...
 
Nouveau WRInaute
Je défini un template avec ou sans cache dans un fichier exemple.php. Ce template est effectivement un objet qui contient ce que l'on veut par exemple :
- le fichier template associé $exemple->setTemplate($_PATH_TO_TPL."exemple.tpl.php");
- un titre : $exemple->set('title', "le titre");
- un array de trucs : $exemple->set('list', array("lien1", "lien2", "lien3"));
- ...
Dans ce fichier on effectue les traitements. (le Controlleur). Par exemple les if ( isset ( $_POST['valid'] ) ) ...

Le template associé ne contient que les balises <div> et autres dans un fichier exemple.tpl.php. (Le Modèle).
Dans ce fichier on affiche les objets contenus dans le template. Par exemple le titre : <DIV id="titre"><?=$title?></DIV>

Le style est dans un fichier css. (la Vue).

Si c'est un template avec cache, bein on affiche le cache au lieu de faire le traitement du Controlleur.

Je posterais ici un exemple simple sous peu pour plus de détails.
 
WRInaute impliqué
spout a dit:
N.B.: évite les short tags <?=$title;?> préfère plutôt <?php echo $title;?>
Et pourquoi donc ? Y a t'il une différence de vitesse ? des bugs ou autres ?

Ou juste un code pas forcement portable sur d'autres serveurs pas configurés pour comprendre les short tags ?
 
Nouveau WRInaute
spout a dit:
Ouais en fait je me suis basé sur ce site pour mes templates, en l'améliorant un peu ^^.

spout a dit:
Mais tu as juste le V et C de MVC, c'est pour ça que je m'étonnais de MVC ;)
N.B.: évite les short tags <?=$title;?> préfère plutôt <?php echo $title;?>

Bein non, j'ai : un fichier .tpl.php (le modèle), un fichier .php (le controlleur) et un fichier .css (la vue) ...

J'ai bien séparé la mise en forme, le traitement des données et le design.
 
WRInaute discret
Furinkazan a dit:
Bein non, j'ai : un fichier .tpl.php (le modèle), un fichier .php (le controlleur) et un fichier .css (la vue) ...
J'ai bien séparé la mise en forme, le traitement des données et le design.
...
Et la marmotte elle interprète le php cotés client en javascript ????? :mrgreen:

Plaisanterie mise à part un template = la Vue, le fichier/classe qui injecte les données du modèle dans le template (parsing du template) = Controleur, et le modèle .... c'est ton objet de données normalement que tu utilises dans ton controleur ... donc spout à raison je vois un debut de V de C mais toujours pas de M :D.

Le css ne peut pas être considéré comme une vue vu qu'il ne contient aucune donnée de ton modèle ...

Je suis pas expert en MVC mais c'est comme ça que je l'interprète ...
 
Nouveau WRInaute
Erf, tout dépend de comment tu vois ton modèle. Chez moi, je ne vois pas ça côté données, mais plutôt côté page du site : ainsi le modèle d'une page est bien te fichier .tpl.php .
Effectivement, si tu regarde du côté des données, j'ai le modèle et le contrôleur dans le même fichier. Mais je pense pouvoir séparer ces deux concepts assez aisément. Va falloir que je teste tiens ! :D
 
WRInaute accro
Bonjour,

Désolé de débarquer comme ça mais le script en 1ère page est il encore valable ?
J'utilise le moteur de template de phpBB et niveau SQL/PHP mon site commence à être lourd, il faut que je cache le tout alors que pour l'instant je ne cache que le plus léger : la consolidation des templates.
 
WRInaute accro
Bon en fait ça fait ça car je suis un boulet :mrgreen:
En fait, d'après ce que j'ai compris il y a une partie à placer en entête, et l'autre en pied de page.

Mais chez moi ça ne fonctionne pas. Quand, dans mon footer, je place un ob_end_flush();, ça ne fait rien.
J'ai bien un ob_start() au début de mon script mais on dirait que quelque chose lui fait générer le contenu avant.

Un echo annule l'ob_start()?
 
WRInaute passionné
Salut,

Est il normal que certains fichiers mis en cache soient des fichiers qui :
1-Ne sont pas rewrité même si l'intégralité du site l'est ?
2-Contient des éléments en sup. dans le nom du fichier en cache ( par exemple, j'ai 8 fois "en-" qui se suit dans plusieurs fichier)?
3-à l'origine n'existe pas sur mon serveur?

Merki
 
WRInaute accro
PS : comment faire pour que le cache soit regénéré tous les jours ?
Il faut supprimer tous les fichiers caches ou modifier la durée de validité (et comment) ?
 
WRInaute accro
Lecture de la durée dans un ficher externe, qui pourra définir plusieurs durées qu'on pourra modifier à volonté.
Ou script de vidage du répertoire sur cron.
 
WRInaute accro
Et si je fais simplement
Code:
if (@filemtime($fichierCache)<time()-(3600*24)) { //si la page n'existe pas dans le cache ou si elle a expiré
?
 
WRInaute passionné
Bonjour,

Quelqu'un peut il me dire pourquoi je trouve en cache des fichiers du style :
-cache--?sourcedir=http:--www.boomong.com-bbs--data-1.txt???
-cache-?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+CinmaEtMusiqueDePapaExtraitsDeMusiqueEtDeFilmsEnStreaming+(Cin%C3%A9ma+et+Musique+de+Papa+!+Extraits+de+Musique+et+de+Films+en+Streaming)

ou encore des fichiers aillent une taille à zéro ?

Merci
 
WRInaute discret
Parce que le script cache toutes les requêtes même les 404 du moins dans la version de base.

Ainsi si je veux pourrir ton site et remplir ton disque je fais un script qui appel

une-de-tes-plus-grosse-page.php?dummy=x

avec X de 1 à 500000 et tu te retrouve avec un cache et un disque remplit :D
 
WRInaute passionné
Oki, c'est ce que j'avais constaté également. Du coup j'effectue une vérification d'url.
Par contre, je ne sais toujours pas pourquoi j'ai des fichiers en cache avec une taille de zéro??
 
WRInaute passionné
Oui, page vide du coté de la mise en cache sur quelques fichiers...

Pour pallier à quelques soucis dont celui la, je vérifie que l'url de la page appelé correspond bien à la l'url qui doit normalement s'affiché. Ensuite lors de l'appel au fichier en cache, je vérifie la taille de la page mise en cache, si elle est à zéro, je l'efface et la remet en cache.
J'ai peut être merdé quelque part mais je ne vois pas ou ??
 
WRInaute accro
Bon ben je suis en cours de test sur une de mes pages :) Objectif : diminuer un peu la tension sur mon amie "Base de Données" :) Le code est très rapide à prendre en main, même si bien évidemment il faut l'adapter à chaque site. Et tout cas pour Mon bot Google, parce que Mossieur s'est installé à résidence
 
WRInaute accro
J'ai un souci avec ce script.
Mon fichier caché commence par <?xml
Du coup, impossible de le lire car ça m'affiche
Parse error: syntax error, unexpected T_STRING on line 1

En effet il bloque sur l'ouverture <? ...

Comment faire ?
 
WRInaute accro
- Désactiver les short_open_tag si tu ne les utilise pas (c'est déconseillé de les utiliser)
ou
- Enregistrer le cache dans une extension qui ne sera pas parsée par PHP

Pour les short_open_tag, soit dans php.ini ou via .htaccess:
Code:
php_flag short_open_tag off
 
WRInaute accro
Je vous propose une petite optimisation qui me fait gagner 4 à 10 % de poids sur mes fichiers.
Attention, source illisible après cette manip.
Fonctionne sur tous les navigateurs.

Dans la partie footer :
Code:
$contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
   
//On supprime les caractères inutiles
$contenuCache = str_replace(CHR(10),"",$contenuCache);
$contenuCache = str_replace(CHR(7),"",$contenuCache);
$contenuCache = str_replace(CHR(13)," ",$contenuCache); 
$contenuCache = str_replace("  "," ",$contenuCache); 

   ob_end_flush();// on termine la bufferisation
   if($cacheactive == 1) {
   $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
}
Je vous laisse le soin de faire un Array de remplacement si ça vous parait plus clean.
 
WRInaute accro
milkiway a dit:
Je vous propose une petite optimisation qui me fait gagner 4 à 10 % de poids sur mes fichiers.
Attention, source illisible après cette manip.
Fonctionne sur tous les navigateurs.

J'ai testé à l'arrache, ca m'a tout planté mes javascripts

Bon sinon, je voulais faire un post dédié à Fandecine mais finalement vais juste faire une réponse. Suis feignant :) Bon alors je vois trainer ce post épinglé depuis pas mal de temps, et depuis pas mal de temps... ben je l'ai laissé là sans rien faire. Et puis je me suis dit, il faut que je le teste vraiment. J'ai testé. Vraiment. Résultat : ma machine n'est plus à genoux du tout, je vais même en profiter pour prendre un serveur moins dimensionné et donc moins cher. Et je vais étendre le cache à l'ensemble du site (pour l'instant il ne l'est qu'à quelques rubriques gourmandes)

Je vous montrerais bien des graphs pour vous montrer mais impossible de trouver avec des échelles significatives :) Bref, un très grand merci à Fandecine.
 
WRInaute accro
milkiway a dit:
Exact, une des lignes fous tout JS en l'air, il suffit de tester en les enlevant une à une pour voir.

Voui je vais regarder ca quand je généraliserais un peu le cache. Après que la source ne soit plus lisible, c'est pas grave ca. De toute façon, c'est pas cette source où on voit les bugs :)
 
WRInaute passionné
finstreet a dit:
Je vous montrerais bien des graphs pour vous montrer mais impossible de trouver avec des échelles significatives :) Bref, un très grand merci à Fandecine.

Depuis le temps que je milite pour ce genre de mise en cache :mrgreen:

Mais ce post date un peu et depuis j'utilise un système maison bien plus souple et plus puissant :wink:

Si je trouve le temps de faire un article ... ou si vous me le demandez gentiment :mrgreen:

PS: je viens de voir qu'il n'y a que 22 recos pour ce post 8O Quel scandale :mrgreen: aller, un petit effort :wink:
 
WRInaute accro
milkiway a dit:
Ca m'intéresse !

As tu trouvé le moyen de glisser des données non cachées en plein milieu des pages ?

Ah oui ca m'intéresse aussi ca. Genre un élément qui doit être mis à jour mais c'est juste un tout petit truc
 
WRInaute discret
Bonjour à tous,

J’utilise ce code depuis longtemps maintenant et c'est un vrai bonheur pour les serveurs !!!

Merci beaucoup.

Orsam
 
Discussions similaires
Haut