[script] Mise en cache des pages PHP

WRInaute passionné
:p voila, j'ouvre ce nouveau fil pour plusieurs raison:

- suite à une discussion animée d'hier soir sur le forum Webrankinfo ou il était question de partage de connaissances, de pédagogie, d'aciens et de nouveaux wrinautes (j'espère quen tant que nouveau, j'apprendrais quelque chose aux anciens pour pas qu'ils se barrent! :wink: )
- parce que 'j'ai vu plusieurs fils ou les webmasters s'interrogent sur le passage du mutualiser au dédié (l'astuce que je donne ici permet de soulager énormément le serveur)

Si le truc que je vous communique est déjà archi connu, vous avez le droit de m'insulter!

Voila, sur tous mes sites et ceux de mes clients, j'utilise une mise en cache des pages PHP sous forme de page HTML (non, ce n'est pas pareil que générer un site en HTML statique à partir d'un site dynamique!).

Je vous donne le code plus bas. :idea:

Pourquois procéder de la sorte? tout simplement pour limiter le nombre de requetes mysql (grosses consommatrices de ressources CPU). Pour ceux qui ont du mal à comprendre, cela permet d'eviter le 'too many connection'. Bon si vous êtes sur un mutualisé, ça ne peut être efficace que si tout le monde fait de même. Par contre, sur mes serveurs dédiés, à serveur et traffic équivalent, je double le nombre de sites hébergés!

Code:
[i]ici code php que vous ne voulez pas mettre en cache[/i]
<?PHP
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
	ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
?>
[i]Votre page PHP ici[/i]
<?php
	$contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
	ob_end_flush();// on termine la bufferisation
	$fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
	if ($fd) { 
		fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
		fclose($fd);
  	}
} else { // le fichier cache existe déjà
  include ($fichierCache); // on le copie ici
}
?>

Que fait ce script:

1/ il recupere l'url de la page
2/ transforme cet url en un nom de fichier sans /
3/ teste l'existance de ce fichier dans le répertoire /cache/
4/ si le fichier n'existe pas, génére la page, puis la stoque dans le repertoire cache
/5 si le fichier existe, l'ouvre en tant que page html

La page html est générée lors de la premiere requete. Avce ce système, il faut gerer le cache lors des mises à jour (effacer la page du cache correspondante).

Je gere un site de + de 80 000 pages avec ce système sans problème notoire!

Voila!

si vous êtes sages et que ce fil a du succé, je vous filerez une autre astuce de temps en temps.
Code:
 
WRInaute occasionnel
Merci pour ce code! Même si je n'ai pas encore de problèmes au niveau des performances de mon hébergement, j'essaierai de mettre en place ce système, mieux vaut prévenir que guérir :wink:
Si j'ai bien compris, tu te sers de cette ligne:
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360))
pour spécifier la durée d'expiration d'un fichier cache, et si je sais bien calculer, là il est spécifié que si le fichier a moins d'un an d'existence, on ne le rafraîchit pas. C'est bien ca?
 
WRInaute occasionnel
Il y a même possibilité d'améliorer ton script: dans spip (qui propose aussi un système de cache), chaque page peut être rechargée grâce à un paramètre GET recalcul, il suffirait de faire:
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360) || isset($_GET['recalcul']))
pour ne pas avoir à se connecter en ftp et supprimer le fichier pour faire une mise à jour... on aurait qu'à appeller la page avec ce paramètre recalcul.
 
WRInaute passionné
j'y avais pensé, mais quand je fais des mises à jour, ça concernne parfois des centaines de pages et là le ftp est imbatable!
 
WRInaute impliqué
merci fandecine c'est énorme, ça fait un moment que je voulais m'y mettre.

par contre pour faire la casse pieds, tu pourrais pas mettre en anotation le rôle de chaque ligne avec des "//" comme ça ce serait plus facile à comprendre.
à partir de "ob_start(); " je suis complètement perdue :oops:

merci
carole
 
WRInaute accro
Salut,

Moi aussi j'utilise du cache HTML, il n'y a rien de tel :)

Mais avec des templates à la "Smarty" sauf que c'est du PHP PUR !
Pas besoin de réinventer la roue, PHP est parfait pr les templates ;)

Je ne coupe plus la page en header/footer comme l'on ferais avec des pseudo templates PHP, c'est bcp plus simple à modifier le "layout".

Le tuto sur lequel je me suis basé:
http://www.massassi.com/php/articles/template_engines/

Je ne remercierais jamais assez Brian Lozier d'avoir montré cette superbe alternative à Smarty... j'étais parti pour utiliser Smarty puis je suis tombé là dessus...
 
WRInaute passionné
caro a dit:
par contre pour faire la casse pieds, tu pourrais pas mettre en anotation le rôle de chaque ligne avec des "//" comme ça ce serait plus facile à comprendre.

meuh non! t'es pas casse pieds carole! :D

je t'ai rajouté tout plein de commentaires.
 
WRInaute accro
Exactement se que je suis en train de mettre en place depuis trois jours sur mes sites ;-)

C'est génial :)

Et avec un dédié on peut en plus coupler ça avec d'autres caches (sql, php accelerator)
 
Membre Honoré
fandecine l'astuce est très interessante et j'imagine que ohax va débarquer pour en donner son opinion :lol:
sinon les pavés je suis pas trop fans mais c'est très gentil de mettre cette formule que jai lu directement et que j'apprécie beaucoup ;)
 
WRInaute accro
Il manque la supression du cache...

En fait il faudrait expliquer comment supprimer les fichiers si on modifie la page plutot que d'attendre la fin du temps de cache ça permettrai de l'appliquer à un forum par exemple, ou à un blog ;-)
 
WRInaute accro
Pour la suppression du cache:
La solution que l'on pense de suite:

Code:
exec("rm -f /home/user/public_html/cache/*");

Mais lorsque l'on se retrouve avec beaucoup de fichiers dans un répertoire, il y'a une limitation quelque part dans le kernel linux pour le nombre de fichiers, alors la commande ci-dessus ne fonctionneras plus.

La solution ultime:
Code:
exec("find /home/user/public_html/cache/ | xargs rm");
 
WRInaute passionné
hola! j'avais dit une astuce à la fois! :wink:

bon, prenons un cas concret. Sur le site de mon profil, je vais, cette nuit :cry: , malgrés la fatigue metre à jour la page des sorties en salles (mais aussi des sorties de la semaine prochaine, ajouter des films, des affiches etc...). J'efface le cache en FTP avec une routine du style de celle-ci:

Code:
<?php
	$conn_id = ftp_connect("ftp.monsite.com");
	$login_result = ftp_login($conn_id, "loginftp", "passwordftp"); //connection ftp
	@ftp_site ($conn_id, "CHMOD 777 chemin_vers_le_fichier_a_effacer"); // on change les droit sur le fichier pour pouvoir l'effacer
	@ftp_delete ($conn_id, "chemin_vers_le_fichier_a_effacer
"); // on efface le fichier
	//si plusieurs fichiers à effacer
	foreach (glob("chemin_vers_les_fichiers_a_effacer-*.html") as $filename) { // liste des fichiers correpondants au masque
		@ftp_site ($conn_id, "CHMOD 777 ".$filename);
		@ftp_delete ($conn_id, $filename);
	}
	ftp_quit($conn_id);
?>

N.B: Le ficheir cache est crée par un script PHP, donc avec les attributs groupe et owner egale à PHP. Le fichier cache est supprimé en FTP donc avec l'attribut loginftp! c'est pour cela qu'il faut d'abord changer les droits du fichier à effacer en 0777 pour pouvoir l'effacer.

Voila, c'est un script trés parcellaire car il est trop dépendant de la structure du site, mais couplé à une BDD et une requete mysql c'est trés puissant!
 
WRInaute passionné
en fait j'ai mis un an pour etre sur que le fichier ne soit pas regénéré avant un moment, mais je suis actuellement en train de valider ma BDD enregistrement par enregistrement et dans l'avenir, je donnerais une durée de vie infinie aux fichier cache valides (aucune raison de les générer à nouveau).

Un enregistrement (par exemple un film) est validé lorsque j'ai toutes les infos (casting, synopsis, durée etc...) et toutes les ressources annexes (wallpapers, bande annonce, jaquettes...) A ce moment là, la fiche n'étant plus mise à jour, aucune raison d'effacer le cache.

Par contre, lorsque je modifie le code des pages, je renome le répertoire cache (en connexion SSH) puis j'en recré un vide et hop, ça reppart.

PS: si vous avez des questions, faudrat attendre demain car j'ai un RDV... a demain :D
 
WRInaute accro
Code:
<form action="<?php dcPostUrl(); ?>" method="post" id="comment-form">
<fieldset>

j'ai ça dans une page, et dans le cache <?php dcPostUrl(); ?> = rien du tout.

en gros dans le cache ça me donne:

Code:
<form action="" method="post" id="comment-form">
<fieldset>

une idée du pourquoi du comment?
 
WRInaute accro
Code:
@function dcPostURL

Cette fonction affiche l'URI du billet, son permalien. On l'utilisera dans
l'affichage d'un billet (boucle ou pas). Par exemple:

|<a href="<?php dcPostURL(); ?>">lien permanent</a>
*/
function dcPostURL()
{
	echo $GLOBALS['news']->getPermURL();
}


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

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

Votre page PHP ici

moi cette partie je l'aurai mit dans

if ($fd) {

en adaptant histoire de n'executer le code php QUE SI LE CACHE n'existe pas, car la j'ai l'impression que tu l'executes de toute façon non?
 
WRInaute passionné
pourtant, j'ai mis les commentaires JeunZ! Tu est fatigué ou tu me teste?

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

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

simple, non?
 
WRInaute accro
Je suis d'accord (je suis pas un pro je vais sans doute dire une connerie, surtout que je n'ai jamais utilisé cette histoire de buffer), mais même si ce n'est pas envoyé au navigateur c'est executé coté serveur non?

(aie ca y est je crois que j'ai dit la connerie).
 
WRInaute accro
Et bien alors si on met une condition sur l'existance du fichier cache on peut ne pas executer le code php et ainsi économiser des ressources serveurs.


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


C'est mieux que :

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


Dans la seconde solution celle présentée ici on execute toujours le code php alors que dans un cas c'est inutile je crois.
 
WRInaute impliqué
Vous savez que JP-Cache fait tout cela tres bien, rapidement et depuis tres longtemps ? ;)
 
WRInaute occasionnel
Code:
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page existe dans le cache et n'a pas expirée 
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur 
?> 
[i]Votre page PHP ici[/i] 
<?php 
   $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer 
   ob_end_flush();// on termine la bufferisation 
   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache 
   if ($fd) { 
      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache 
      fclose($fd); 
     } 
} else { // le fichier cache existe déjà 
  include ($fichierCache); // on le copie ici 
}
Jeunz -> c'est ce qu'il fait. Avant de buffériser, il teste si le cache n'est pas expiré, si c'est le cas il fait le include du fichier en cache, sinon il exécute le code en le bufférisant
 
WRInaute accro
Ba alors je comprend pas car avec la méthode ci dessu testé hier pendant 3h la charge de mon dédié n'a pas changé par contre j'avais un affichage un peu plus rapide.

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

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

Maintenent je serais curieux de voir ton code modifié!?
 
WRInaute accro
Ma page consomme énormément niveau sql, 6000 blogs actifs imagine...

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

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

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

Code:
<?PHP


require '/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/themes/stats.php';



$num=substr_replace($_SERVER['HTTP_HOST'], '', -13);
$ext=substr_replace($_SERVER['HTTP_HOST'], '', 0, -3);
$db1 = mysql_connect("localhost","xxxxxxxxx","xxxxxxx");  
mysql_select_db("xxxxxxxxxx",$db1);
list($id_blog) = mysql_fetch_array(mysql_query("SELECT id FROM membres WHERE identifiant='$num' AND domaine='$ext'", $db1), MYSQL_NUM); 
mysql_close($db1);


# ------- Create directories if directories do not exist

$rep= '/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/cache/' .$id_blog .'/';

if (!is_dir($rep)){  

mkdir ( $rep, 0777);

}


$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache= "/home/httpd/vhosts/mon-blog.org/httpdocs/blog/dotclear/cache/" .$id_blog ."/".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page existe dans le cache et n'a pas expirée
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur


 

   
   



   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
   if ($fd) {


# Chemin vers la racine de l'application (si vous changer le fichier de place)
$app_path = '/';


# NE RIEN CHANGER APRES CETTE LIGNE

$blog_file_path = __FILE__;
$blog_dc_path = dirname(__FILE__).$app_path;

require $blog_dc_path.'/layout/prepend.php';


# En-têtes et prologue
# Envoie des en-tête HTTP
$accept_xml =
	!empty($_SERVER['HTTP_ACCEPT']) &&
	strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') !== false;

if (dc_send_real_xml && $accept_xml) {
	header('Content-Type: application/xhtml+xml');
} else {
	header('Content-Type: text/html; charset='.dc_encoding);
}

//if ($accept_xml) {
//	echo '<?xml version="1.0" encoding="'.dc_encoding.'"    '."\n";
//}




include $dc_template_file;


require $blog_dc_path.'/layout/append.php';


   $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
   ob_end_flush();// on termine la bufferisation



      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
      fclose($fd);
     }
} else { // le fichier cache existe déjà




if (!empty($_POST['redir'])) {


# Chemin vers la racine de l'application (si vous changer le fichier de place)
$app_path = '/';


# NE RIEN CHANGER APRES CETTE LIGNE

$blog_file_path = __FILE__;
$blog_dc_path = dirname(__FILE__).$app_path;

require $blog_dc_path.'/layout/prepend.php';



}
else{
  include ($fichierCache); // on le copie ici
}


}








?>
 
WRInaute passionné
hum! c'est dur de lire du code que l'on a pas écrit!

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

Par contre une remarque sur ton script: ta requete mysql, pourquois ne la met-tu pas en cache? un processus mysql ça consomme, et si tu a un gros traffic...
 
WRInaute accro
Oui t'inquiete je vais la mettre en cache, c'était juste le temps de tester...

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

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


donc c'est moi qui avait mal lu ton code ;-)
 
WRInaute impliqué
Re: Mise en cache des pages PHP

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

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

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

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

Edit: désolé je pensais que tu ne comprenais pas l'instruction php... :oops:
 
WRInaute passionné
Oups! j'ai fait une erreur de commentaire; :oops:

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

je corrige de suite!

Bravo, caro! tu est la seule à avoir remarqué la bourde! :D
 
WRInaute impliqué
merci beaucoup fandecine, maintenant je comprends bien ton code et je le trouve excellent !
je te félicite et te remercie de nous avoir fait partager ton expérience.
mon serveur aussi te remercie :lol: :lol: :lol:
carole
 
WRInaute accro
fandecine a dit:
Oups! j'ai fait une erreur de commentaire; :oops:

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

je corrige de suite!

Bravo, caro! tu est la seule à avoir remarqué la bourde! :D

Ba non c'est se qui m'embrouillait aussi et depuis hier lol.

J'ai été obligé de virer tes commentaires pour tenter de comprendre en début d'aprem lol.
 
WRInaute occasionnel
Une question, comment se comporte ce système vis à vis des robots d'indexation? voient ils toujours les mêmes pages ou n'y aurait il pas un problème de duplicate content dû au fait que l'extension html apparaisse? :)
 
WRInaute occasionnel
Pour le visiteur comme pour le robot, il n'y a pas de différence. Ce script mais juste en cache le contenu ou l'inclut s'il est déjà en cache, c'est complètement invisible (enfin pas au niveau du serveur, qui peut souffler un peu :lol: )
 
WRInaute occasionnel
Merci pour ta réponse en fait je n'avais pas lu le script avant de poser ma question, j'ai pas l'air fin maintenant :mrgreen:
 
WRInaute discret
salut,
J'essais de comprendre cette nouvelle notion (pour moi) de mise en cache!
Je suis en train de créer un site proposant la possibileté de créer des albums photos! Parconséquent il semble judicieux d'utiliser la mise en cache!(pour éviter de répéter toutes les requetes MySQL)
Si j'ai bien compris, il me faudra régénérer le cache à chaque fois qu'un nouveau utilisateur met à jour son album????
(dites moi si c'est ca SVP)

merci
bye
 
WRInaute passionné
bonjour,

La page en cache est généré automatiquement lors du chargement de la page de ton site. Si tu fait une mise à jour d'une page, le mieux est de faire un script qui efface la page correspondante du cache lors de la mise à jour.
 
WRInaute discret
ok merci,
donc si je suis bien, si un utilisateur rajoute une photos (par exemple), je suprime l'ancien cache et j'en créer un nouveau?
 
WRInaute passionné
pas tout a :? fait!

tu suprime le fichier correspondant du cache, le nouveau sera créé automatiquement lors du premier chargemlent de la page! :D
 
WRInaute discret
bon je suis aller lire d'autre info pour essayer de comprendre et en gros:
if (je regarde si le cache existe et s'il existe) {
j'affiche le cache
}

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

la structure ressemble-t-elle à ca!!!?
 
WRInaute passionné
if (je regarde si le cache existe et s'il existe) {
j'affiche le cache
}

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

Comme ça, c'est mieux! :wink:
 
WRInaute discret
A voui!!! j'avais oublié de remettre le tout de la cache!!! (sacré moi!!!)
Merci beaucoup en tout cas!
 
WRInaute discret
Bonjour ,

J'ai quelques questions bêtes :

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

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

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

Merci pour vos réponses
 
WRInaute passionné
kinglouis a dit:
Bonjour ,

J'ai quelques questions bêtes :

Une question bien formulée n'est jamais bête! :wink:

kinglouis a dit:
1 ) Dans le code donné sur la page d'accueil , il faut juste mettre notre contenu entre les balises [ i ] ?
Oui
kinglouis a dit:
2 ) Ca va générer un fichier dans le FTP c'est bien ça ?
Le fichier est généré dans le dossier cache
kinglouis a dit:
3 ) Quand on fait une modification on supprime manuellement le fichier créé ?

Tu peux aussi utiliser le script php dont j'ai donné le source plus haut dans ce fils.
 
WRInaute discret
Bonjour ,

Alors j'ai essayé :

1 ) J'ai inséré ce code dans une page :
Code:
<?PHP
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur



echo"lolo";
                
              

   $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
   ob_end_flush();// on termine la bufferisation
   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
   if ($fd) {
      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
      fclose($fd);
     }
} else { // le fichier cache existe déjà
  include ($fichierCache); // on le copie ici
}
?>
Ce code est dans une page test.php située dans le dossier test

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

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

Ou est l'erreur ?

Merci
 
WRInaute passionné
Ajoute echo $contenuCache; juste aprés la ligne ob_end_flush();

Tu doit obtenir:

lolololo lorsque tu affiche ta page test.php.

Si ça marche pas, cela veut dire que la bufferisation ne marche pas. Peut tu me dire quelle version de PHP tu utilise?
 
WRInaute discret
Ca marche avec ton code :


Code:
<?PHP
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur



echo"lolo";
                
              

   $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
   ob_end_flush();// on termine la bufferisation
   echo $contenuCache;
   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
   if ($fd) {
      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
      fclose($fd);
     }
} else { // le fichier cache existe déjà
  include ($fichierCache); // on le copie ici
}
?>

Merci !

( Version de PHP : PHP Version 4.3.10 )
 
WRInaute discret
Euh y a juste un truc , quand je rajoute echo $contenuCache; , la première fois que j'execute ça m'affiche 2 fois le contenu .

C'est que a première fois donc ça va mais y aurait pas une petite astuce pour que ça le fasse pas ?
 
WRInaute passionné
je t'ais fait faire ce test pour savoir si la bufférisation marchait. Donc elle marche!

Tu peut effacer la ligne que je t'ai fais rajouté. Efface le fichier dans le cache et essaye à nouveau. Si tu as un problème, contacte moi par MP.
 
WRInaute occasionnel
Bonjour
Ce serait possible de rajouter le code pour vérifier qu'il n'existe pas de page plus récente dans la db et de mettre le cache à jour en conséquence :oops:
 
WRInaute passionné
tawath a dit:
Bonjour
Ce serait possible de rajouter le code pour vérifier qu'il n'existe pas de page plus récente dans la db et de mettre le cache à jour en conséquence :oops:

Si je comprends bien ce que tu veux faire, c'est de tester dans la BDD la date de mise à jour de la page et si la date est plus recente que le fichier en cache, générer un nouveau fichier dans le cache?
 
WRInaute passionné
et pourquoi pas! :oops:

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

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

Je le teste et le publie dés que possible!
 
WRInaute occasionnel
fandecine a dit:
tawath a dit:
Bonjour
Ce serait possible de rajouter le code pour vérifier qu'il n'existe pas de page plus récente dans la db et de mettre le cache à jour en conséquence :oops:

Si je comprends bien ce que tu veux faire, c'est de tester dans la BDD la date de mise à jour de la page et si la date est plus recente que le fichier en cache, générer un nouveau fichier dans le cache?

Affirmatif :wink:
Tu m'a compris j'ai pas envie de jouer du ftp pour supprimer une page parmi des centaines.... :?
Ton script?
avec joie si il génére aussi la sitemap pour gogol1er que du bonheur :D Je te guette Fan!

Jpcache je vais me documenter,masi quitte à reinventer la poudre on peut l'améliorer parfois :wink:
 
WRInaute passionné
ok tawath!

si t'es pas trop pressé, je publie tout ça dans la semaine, car là, je suis un peu charette! :wink:
 
WRInaute occasionnel
Impecable je suis prêt à beta-tester :)
Bonne nuit
ps:moi aussi je suis chariot cette semaine :cry:
 
WRInaute passionné
Avec le même objectif d'accélérer le chargement des pages et diminuer la charge du serveur, je suis entrain de revoir le fonctionnement d'un de mes sites.

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

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

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

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

Fab
 
WRInaute occasionnel
yep, faut que je teste cette histoire de mise en cache, je connais ça avec SPIP et c'est vrai que c'est plutot efficace:)
 
WRInaute accro
Bonjour,

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

Cependant quelques questions me taraudent encore…

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

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

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

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

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


Désolé de toutes ces interrogations, mais en tout cas encore un grand bravo….
Merci !!!!!!!!!!
 
WRInaute passionné
thierry8 a dit:
Bonjour,

Alors tout d’abords un grand bravo pour ce partage…. ! Et félicitation…
merci! :wink:
thierry8 a dit:
Cependant quelques questions me taraudent encore…

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

par exemple, sur le site de mon profil, il faut compter 5 à 6 requêtes sql par page en moyenne (un peu plus pour la page d'accueil et les têtes de rubriques, un peu moins pour les pages de contenu) à multiplier par 15 à 20.000 pages par jours (pointe du traffic entre 18h30 et 21h30) soit en pointe 8 à 10.000 requêtes sql à l'heure!
thierry8 a dit:
- Je n’est pas bien saisie concernant le dossier cache, faut-il simplement le créer ? (dans ce cas quel droit unix doit-on lui donner, à quel endroit le créer ? public_html ?)

le dossier cache doit être accessible par un script php (je le met à la racine du site). Pour ce qui est des droits, public en lecture bien sur, en ecriture cela dépends de la config du serveur. Il peut etre en 755 par exemple si php en est le propriétaire.
thierry8 a dit:
- Vous dites que cela est avantageux si l’on est sur un serveur dédié… Mais si le dossier cache est à la racine de notre site, cela revient au même pour un serveur mut. Car le principe reste le même ! Plus besoin de régénérer le document, il est directement envoyé ? ai-je bien compris…. ?

Lorsque je dis que c'est moins interressant sur un mutualisé c'est parce que les ressources étant partagées par plusieurs sites, si il n'utilisent pas tous la mise en cache, l'éconnomie de resources sql peut ne pas être significative. En fait, si tu utilise la mise en cache sur ton site sur un mutualisé, tu partage le gain de ressources entre tous les sites héberges sur ce serveur.
thierry8 a dit:
- Si l’on possède un forum, on applique aussi ce type de méthode ? (je pense que ce doit-être lourd, non ? chaque modification supprimer la page en cache, la recréer en cache à la première demande…cela peut-être lourd pour un forum subissant beaucoup de modifications ?)
si ton forum est rewrité, ce n'est pas trés sorcier à mettre en place ni lourds. Par contre, s'il n'est pas rewrté, il te faut faire une tranformation d'une url en nom de fichier valide et unique. En fait, la taille du site n'est pas un problème (le site de mon profil compte plus de 50000 pages!), la fréquence de mise en jours non plus (je fait des mises à jour tout les jours) cela impose seulement beaucoup de rigueur et une structure de site simple et claire pour ne pas oublier d'effacer des pages lors des mises à jour (une simple mise à jour peut effacer 3 à 400 pages du cache)
thierry8 a dit:
- Enfin, pour supprimer la page en cache (j’ai bien bien compris qu’il y a un une méthode ftp) mais par impossibilité de procéder comme ceci, je souhaiterais savoir s’il existe une fonction (un code comme pour l’ajout en cache) qui permettrais de supprimer la page en cache à chaque modifcation…(par exemple un site administrable, qui voit son accueil modifier une foi par semaine, cette méthode serait très aventageuse !
Si tu ne peux pas utiliser les fonctions ftp, tu peux essayer avec la fonction unlink de php.

voila! :D
 
WRInaute accro
Ok ! merci pour ces éléments complémentaires...

thierry8 a écrit:

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


le dossier cache doit être accessible par un script php (je le met à la racine du site). Pour ce qui est des droits, public en lecture bien sur, en ecriture cela dépends de la config du serveur. Il peut etre en 755 par exemple si php en est le propriétaire.

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

thierry8 a écrit:

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


Lorsque je dis que c'est moins interressant sur un mutualisé c'est parce que les ressources étant partagées par plusieurs sites, si il n'utilisent pas tous la mise en cache, l'éconnomie de resources sql peut ne pas être significative. En fait, si tu utilise la mise en cache sur ton site sur un mutualisé, tu partage le gain de ressources entre tous les sites héberges sur ce serveur.

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

thierry8 a écrit:

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

si ton forum est rewrité, ce n'est pas trés sorcier à mettre en place ni lourds. Par contre, s'il n'est pas rewrté, il te faut faire une tranformation d'une url en nom de fichier valide et unique. En fait, la taille du site n'est pas un problème (le site de mon profil compte plus de 50000 pages!), la fréquence de mise en jours non plus (je fait des mises à jour tout les jours) cela impose seulement beaucoup de rigueur et une structure de site simple et claire pour ne pas oublier d'effacer des pages lors des mises à jour (une simple mise à jour peut effacer 3 à 400 pages du cache)

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

voila! :roll:
 
WRInaute occasionnel
Hello
je fais tourner un cache sur un site en mutualisé ca soulage sans plus
en cas de requêtes multiple la db ne decroche plus
sur un site en duplicate mais dans un sous-domaine du premier
pas de cache et l'index s'affiche en moitie moins de temps...
La science s'interroge :oops:
 
WRInaute passionné
Merci beaucoup !

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

J'espère que ça réduira le nombre d'erreurs "maximum de connections simultanées" :(
 
WRInaute passionné
Dj_Apx a dit:
J'espère que ça réduira le nombre d'erreurs "maximum de connections simultanées" :(

c'est fait pour ça! :wink:

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

thierry8 a écrit:

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


le dossier cache doit être accessible par un script php (je le met à la racine du site). Pour ce qui est des droits, public en lecture bien sur, en ecriture cela dépends de la config du serveur. Il peut etre en 755 par exemple si php en est le propriétaire.

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

thierry8 a écrit:

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


Lorsque je dis que c'est moins interressant sur un mutualisé c'est parce que les ressources étant partagées par plusieurs sites, si il n'utilisent pas tous la mise en cache, l'éconnomie de resources sql peut ne pas être significative. En fait, si tu utilise la mise en cache sur ton site sur un mutualisé, tu partage le gain de ressources entre tous les sites héberges sur ce serveur.

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

thierry8 a écrit:

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

si ton forum est rewrité, ce n'est pas trés sorcier à mettre en place ni lourds. Par contre, s'il n'est pas rewrté, il te faut faire une tranformation d'une url en nom de fichier valide et unique. En fait, la taille du site n'est pas un problème (le site de mon profil compte plus de 50000 pages!), la fréquence de mise en jours non plus (je fait des mises à jour tout les jours) cela impose seulement beaucoup de rigueur et une structure de site simple et claire pour ne pas oublier d'effacer des pages lors des mises à jour (une simple mise à jour peut effacer 3 à 400 pages du cache)

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

voila! :roll:

Peut tu me renseigner fandecine STP ?
merci bcp...!!!!!!!!!
 
WRInaute passionné
Houlala! Veux me faire bosser un 14 juillet! :wink:

thierry8 a dit:
Donc il s'agit bêtement d'un dossier quelconque que l'on utilise pour gérer notre cache....
Tout à fait! Même le nom du dossier est arbitraire...

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


thierry8 a dit:
:
Ce que je voulais dire, c'est qu'il peut savèrer plus long, pour l'utilisateur...
je m'explique, pour un forum, en prennant un sujet, s'il subit beaucoup de modification, il faudra non seulement rechercher la page dans la base de données mais en plus de ca il faudra très souvent ajouter ou supprimer dans le cache...donc la ou je veux en venir c'est que l'on peut etre perdant du fait que si c'est quelque chose qui est souvent modifié...on effectue plus de commande...donc pas de gain...voyez ou je veux en venir ?
Quelquesoit le nombre de modifications, dans le pire des cas (c'est à dire quand la page n'est pas en cache) le système se comporte comme si il n'y avait pas de cache (l'effacement d'un fichier dans le cache consommant trés, trés peu de ressources). Si tu tiens compte du fait qu'un post dans un forum est 10 fois plus lu que modifié, le gain en ressources reste trés important.

Voila! :D
 
WRInaute accro
Ok !

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

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

Merci à toi,
bonne journée... :wink: :wink: :wink:
 
WRInaute passionné
Du cache sur les pages d'un forum ?
C'est quand même plutôt difficile, dès que le forum est actif... il faudrait pouvoir tester si on est sur la dernière page du sujet ou pas, pour éviter de plomber les conversations pendant 10 minutes !

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

Edit : ok j'ai compris... l'astuce serait de supprimer le cache quand un nouveau message est posté dans le sujet :)
 
WRInaute accro
fandecine ! il y a juste encore un truc que je ne comprends pas !

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

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

et ne pas plutôt tester tout simplement si le fichier existe...!?

car la tous les an il faut recréer le fichier ! bien que ce ne soit pas méchant ! ce n'est pas utile non plus....
 
WRInaute passionné
thierry8 a dit:
fandecine ! il y a juste encore un truc que je ne comprends pas !

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

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

et ne pas plutôt tester tout simplement si le fichier existe...!?

car la tous les an il faut recréer le fichier ! bien que ce ne soit pas méchant ! ce n'est pas utile non plus....

c'est juste un exemple!

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

donc la inutile de tester sur la date...
Autant faire un file_exist non ?
 
WRInaute passionné
thierry8 a dit:
oui mais ce que je veux dire (et faire... lol)
c'est par exemple dès qu'il y à une modification sur une page, l'effacer de la cache...donc à la première demande elle sera remis à jour automatiquement...

donc la inutile de tester sur la date...
Autant faire un file_exist non ?

si tu veux...
 
WRInaute accro
non mais c'était juste une question...

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

mais bon comme di, c'est une simple proposition...et une question qui me trotait ! donc vla....
 
WRInaute accro
Excuse moi, je me permet encore de t'embeter un petit peu...

j'ai lu les fonctions ob_get_contents et ob_end_flush !

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

et

ob_get_contents : Retourne le contenu du buffer de sortie

pourquoi utiliser ob_get_contents si ob_end_flush renvoie aussi le contenu ?

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

Merci !!! :oops:
 
WRInaute passionné
et pourquois pas! :wink:

Si vous voulez continuer à manipuler la valeur du buffer, vous pouvez appeler ob_get_contents() avant ob_end_flush() car le contenu du buffer est détruit après un appel à ob_end_flush().

voila pourquoi!
 
WRInaute accro
oui mais inutile dans ce cas ou alors utiliser ob_end_clean() ! non ?

:oops: :oops: désolé ! j'essaye juste de comprendre !
lol j'essaye...
 
WRInaute accro
c'est bon j'ai compris !

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

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

EDIT:

si l'on pratique l'url rewriting, est ce que le paramètre REQUEST_URI se base sur l'url réécrite ou sur celle entrée par l'utilisateur ? (dans le deuxième cas cela facilite la tâche) ?
 
WRInaute passionné
thierry8 a dit:
si l'on pratique l'url rewriting, est ce que le paramètre REQUEST_URI se base sur l'url réécrite ou sur celle entrée par l'utilisateur ?

REQUEST_URI contient l'url rewrité.

Si pas de rewriting, il faut convertir l'url avec les parametres en nom de fichier unique.
 
Nouveau WRInaute
Salut à tous,

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

Code:
<?PHP
$urldemandee=$_SERVER['REQUEST_URI']; //on lit l'adresse de la page
$urldemandee=ereg_replace('/','-',$urldemandee); // on tranforme l'adresse en nom de fichier
if($urldemandee=="-") $urldemandee="-index.html"; // si l'adresse est la racine du site, on ajoute index.html
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600*24*360)) { //si la page n'existe pas dans le cache ou si elle a expiré
   ob_start(); // on démarre la bufferisation de la page: rien de ce qui suit n'est envoyé au navigateur
?>
<?php
header("Content-Type: text/xml");
$flux = $_GET['url'];
// make sure that some page is really being called
if ($flux && $flux != ""){
	// make sure that an http call is being made - otherwise there's access to any file on machine...
	if ((strpos($flux, "http://") === 0) || (strpos($flux, "https://") === 0)){
		readfile($flux);
	}
}
?>
<?php
   $contenuCache = ob_get_contents(); // on recuperre le contenu du buffer
   ob_end_flush();// on termine la bufferisation   
   $fd = fopen("$fichierCache", "w"); // on ouvre le fichier cache
   if ($fd) {
      fwrite($fd,$contenuCache); // on ecrit le contenu du buffer dans le fichier cache
      fclose($fd);
     }
} else { // le fichier cache existe déjà
  include ($fichierCache); // on le copie ici
}
?>

Merci de votre aide.
Florent
 
Nouveau WRInaute
je viens de résoudre mon problème :

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

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

qui devait être interprété comme du php.
 
WRInaute discret
Hello ;)

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

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

Code effacé

L'appel se fait de cette maniere :

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

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

Une idée ?
 
WRInaute passionné
Bonjour,
NoName, les variables globales dans une fonction c'est vraiment pas terrible, sers-toi plutôt d'un paramètre. Pour chercher le bug fais comme tout programmeur : mets des echo() pas à pas avec les valeurs des variables utilisées.
 
Nouveau WRInaute
Peux t - on se passer de la la base de données?

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

Vos explications sont tellement bien faites que je ne suis plus foutu de réfléchir moi même.
Voila mon probème j'ai dans mes pages un formulaires de recherche qui renvoie vers une page résultat qui bien sur n'est jamais la même.
Bref comment mettre un test avant le script de mise en cache pour qu'on affiche directement cette page sans passer par le cache.
 
Discussions similaires
Haut