[script] Mise en cache des pages PHP

WRInaute occasionnel
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
 
WRInaute passionné
Ohax a dit:
comment faire pour ne pas mettre en cache une partie précise de la page ?

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.
 
WRInaute accro
Bonsoir,

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


comment je peu faire ?
 
WRInaute passionné
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é.
 
WRInaute accro
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
 
WRInaute impliqué
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.

++
 
WRInaute passionné
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!
 
WRInaute impliqué
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 ;)
 
WRInaute passionné
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:
 
WRInaute impliqué
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.

++
 
A
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é...
 
Nouveau WRInaute
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.
 
Nouveau WRInaute
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)
 
Nouveau WRInaute
Oki, merci bien.

Je vais rechercher un peu tout ca et je prendrai celui qui correspond le plus à mes besoins.
 
WRInaute discret
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??
 
WRInaute discret
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.
 
WRInaute passionné
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 !
 
WRInaute passionné
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
 
WRInaute passionné
medium69 a dit:
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

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
 
WRInaute discret
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 ...
 
Nouveau WRInaute
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,
 
WRInaute discret
ShePaKoiFer a dit:
Bonjour,

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.
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 +
 
Nouveau WRInaute
A chaque changement de contenu je supprime le cache correspondant comme le prochain internaute aurra bien la dernière version.

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 ?


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.

Je viens de trouver la solution en t'exposant le problème en détail :)
 
WRInaute discret
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 ?

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().
 
WRInaute discret
ShePaKoiFer a dit:
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 ?

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:
 
Nouveau WRInaute
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
 
WRInaute passionné
Ryoh a dit:
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...

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.

Ryoh a dit:
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
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é!
 
WRInaute discret
Ryoh a dit:
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

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.
 
Nouveau WRInaute
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
 
Nouveau WRInaute
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")
 
Nouveau WRInaute
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!
 
WRInaute passionné
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.
 
Nouveau WRInaute
"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
 
WRInaute discret
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 ;)
 
WRInaute discret
Dj_Apx a dit:
Tu mets tes liens admin en-dehors de la partie en cache...

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
 
WRInaute occasionnel
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.
 
WRInaute discret
nalrem a dit:
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.

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.
 
WRInaute occasionnel
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.
 
WRInaute discret
Merci de ton exemple, par contre en quoi je suis gagnant ? ca evite 2 includes ? moi c'est surtout pour eviter des reqs SQL.
 
WRInaute occasionnel
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 ?
 
WRInaute discret
nalrem a dit:
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 ?

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.
 
WRInaute occasionnel
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).
 
WRInaute occasionnel
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.
 
WRInaute discret
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.
 
WRInaute occasionnel
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.

Reprends le code au dessus et ajoute cette définition de fonction:

Code:
jeSuisUneFonctionQuiVaPuiserDansMysqlEtQuiRenvoitEnEchoLesResultats()
{
  $sql = "SELECT nom FROM table WHERE 1";
  $res = demande_sql($sql);

  /*demande_sql est une fonction qui se connecte à une table et lancer la
  requete en paramètre.*/
  
  $texte='';
  while ($res2 = mysql_fetch_array($res)){
    $texte.='<li>'.$res2['nom'].'</li>';
  }
  echo '<ul>'.$texte.'</ul>';
}

Voilà. ce code, on est d'accord fait partie de ton fichier qui sert de "gabarit" pour la mise en cache. Le fichier qui en résulte ne va donc plus contenir ce texte, mais ce que renvoit la fonction.
 
WRInaute discret
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
 
WRInaute occasionnel
Bien sûr que non :) J'ai mis un exemple, mais tu peux mettre virtuellement n'importe quel code que tu souhaites.
 
Nouveau WRInaute
:( 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!
 
Nouveau WRInaute
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...
 
WRInaute discret
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 " ?
 
Nouveau WRInaute
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.
 
WRInaute occasionnel
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 :

echo "<? include 'machin.php'; ?>";

On pourra récupérer le cache de manière à ce que la commande php s'execute.
 
WRInaute discret
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 :)
 
WRInaute discret
Bh@Mp0 a dit:
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 :)

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 )
 
WRInaute discret
nalrem a dit:
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 :

echo "<? include 'machin.php'; ?>";

On pourra récupérer le cache de manière à ce que la commande php s'execute.

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 ... ><
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
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.
 
Nouveau WRInaute
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 ?
 
WRInaute discret
yackphoto a dit:
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 ?
vérifiez les droits d'écriture du fichier.
Créez préalablement le dossier :wink:
 
WRInaute passionné
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...
 
WRInaute passionné
lothar a dit:
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...

Bien sur que les scripts javascript sont exécutés
 
WRInaute occasionnel
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
 
WRInaute passionné
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 !!
 
WRInaute passionné
h4ni a dit:
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

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 !
 
WRInaute passionné
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 :- ?
 
WRInaute passionné
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 :-/ ?
 
WRInaute passionné
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.
 
WRInaute discret
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
 
WRInaute passionné
mikaweb a dit:
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

D'autant que preg_replace est beaucoup plus rapide.
 
WRInaute discret
itsme a dit:
Vous savez que JP-Cache fait tout cela tres bien, rapidement et depuis tres longtemps ? ;)

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 ??
 
WRInaute discret
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 ?
 
WRInaute passionné
Misix a dit:
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 ?

Aucunement ; je suis dans le même cas que toi et tout fonctionne.

ça doit être une erreur dans ton script
 
WRInaute discret
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é ?
 
WRInaute passionné
Misix a dit:
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é ?

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à.
 
Nouveau WRInaute
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 :)
 
Nouveau WRInaute
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 ?
 
WRInaute occasionnel
mathias59 a dit:
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 ?
oui ;)
 
Nouveau WRInaute
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:
ShePaKoiFer a dit:
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.
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".
 
WRInaute accro
Tempus a dit:
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".

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.
 
WRInaute occasionnel
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.
 
Discussions similaires
Haut