Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1834 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  un site en PHP/MySQL avec seulement des pages HTML en cache !?!?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

un site en PHP/MySQL avec seulement des pages HTML en cache !?!?

n°577881
moon06
Ignorance is bliss
Posté le 27-11-2003 à 22:12:10  profilanswer
 

voila, en fait, j'ai un site entièrement PHP/MySQL avec des mises à jour très fréquentes sur toutes les pages dues à des changements de nombre de news, commentaires, titres, etc ...
 
j'aimerais savoir quel est le moyen le plus efficace pour utiliser directement des pages HTML tout comme le font Clubic, PC Inpact ... et donc limiter les requêtes PHP/MySQL inutiles.
 
je sais qu'il faut utiliser un système de cache, mais comment exactement ? comment est-ce que les pages vont se mettre à jour automatiquement ?
 
merci d'avance !  :hello:  :jap:


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
mood
Publicité
Posté le 27-11-2003 à 22:12:10  profilanswer
 

n°577885
porksoda
Posté le 27-11-2003 à 22:17:23  profilanswer
 

c'est probable des scripts CRON (en simple des batches de DOS disons mais version *NIX) éxécutés à tous les 10 mins (exemple) directement roulé sur la platte forme comme tel...un script vérifie si il y a tel enregistrement à telle place dans la BD, si oui, il modifie "la_page.html"...
 
Je fais peut-être aucun sens... :pt1cable:


Message édité par porksoda le 27-11-2003 à 22:23:14
n°577889
drasche
Posté le 27-11-2003 à 22:24:12  profilanswer
 

plutôt un query cache au niveau du serveur SGBD, ça améliore pas mal les performances :o
 
quand au fait de voir html comme extension, ben ça empêche pas d'avoir du php dedans et de demander au serveur de l'interpréter comme du php (pour pas qu'on sache qu'il y a du php derrière, tu vois le truc?)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°577891
porksoda
Posté le 27-11-2003 à 22:28:43  profilanswer
 

moi ma réponse était plus claire...  :heink:


Message édité par porksoda le 27-11-2003 à 22:28:56
n°577893
drasche
Posté le 27-11-2003 à 22:39:35  profilanswer
 

c'est pas question d'être clair, c'est que ma réponse est la plus simple à mettre en oeuvre, beaucoup plus simple :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°577895
moon06
Ignorance is bliss
Posté le 27-11-2003 à 22:44:05  profilanswer
 

je sais bien qu'avec les iframe on peut mettre du php dans une page .html, mais quel intérêt ...
 
ce que je voudrais c'est tout comme PCI ou Clubic, faire vraiment un site entièrement basé sur du dynamique en faisant le moins de requêtes et d'exécutions de scripts possibles pour limiter l'utilisation de ressources !


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
n°577900
drasche
Posté le 27-11-2003 à 22:48:53  profilanswer
 

non t'as pas compris :o
 
disons que t'as écrit un script php et tu le sauves avec l'extension html au lieu de php. Dans la config d'apache, tu lui dis que tu veux voir les pages html traitées par php, voilà.
 
ça correspond à ceci dans httpd.conf
 

Code :
  1. AddType application/x-httpd-php .php .html


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°577903
karamilo
Posté le 27-11-2003 à 22:54:45  profilanswer
 

n'oublions pas non plus l'url rewriting d'apache ...

n°577905
moon06
Ignorance is bliss
Posté le 27-11-2003 à 22:56:56  profilanswer
 

mais quel intérêt ? car à ce moment là les requêtes mysql sont exécutées à chaque fois ... ce que je cherche c'est à n'avoir à exécuter les requêtes SQL et PHP que lorsqu'il y a modif, le reste du temps, c'est une page HTML mise en cache avec les dernières infos qui est affichée ...


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
n°577924
gizmo
Posté le 27-11-2003 à 23:21:19  profilanswer
 

bon, je mets le drapeau ici pour expliquer demain si personne n'a donné la bonne réponse entre temps...

mood
Publicité
Posté le 27-11-2003 à 23:21:19  profilanswer
 

n°577926
ACut
Posté le 27-11-2003 à 23:23:40  profilanswer
 

Le system de cache de Spip -- [http://www.spip.net/fr] -- est très intéressant à analyser. Les sources php montrent notammment comment fonctionnent:
- la "mise en délai" du recalcul des pages
- la table de hashage qui stocke les html
 
Cet exemple devrait t'apporter des idées.

n°578019
drasche
Posté le 28-11-2003 à 09:01:56  profilanswer
 

moon06 a écrit :

mais quel intérêt ? car à ce moment là les requêtes mysql sont exécutées à chaque fois ... ce que je cherche c'est à n'avoir à exécuter les requêtes SQL et PHP que lorsqu'il y a modif, le reste du temps, c'est une page HTML mise en cache avec les dernières infos qui est affichée ...


l'intérêt c'est que grâce au query cache de MySQL, la requête n'est pas vraiment exécutée. Comme 90% du temps de génération d'une page est passé dans une requête SQL, j'y vois tout de suite mon intérêt.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°578047
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-11-2003 à 09:52:50  profilanswer
 

sur hardware.fr (le site, pas le forum :D), y a ça dans le haut des pages :

Code :
  1. <!-- CACHE -->
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <!-- DATE DE CREATION: 28/11/2003 à 09:21:25 -->
  4. <!-- DATE D'EXPIRATION: 28/11/2003 à 09:36:25 -->
  5. <!-- PRICELMAR -->
  6. <html>
  7. [...]


Je suppose que c'est le signe qu'ils ne génèrent pas les pages à chaque demande ? :??:
 
Sur telecharger.com ils utilisent le même genre de trucs : des pages HTML sont générés la nuit (j'ai lu ça quelque part sur leur forum)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°578054
Freekill
Electron libre…
Posté le 28-11-2003 à 10:02:17  profilanswer
 

Je suppose quand même qu'il y a des formulaires pour ajouter/modifier des trucs sur le site.
 
Il suffit de déterminer quelles sont les pages affectées par l'opération et de les regénérer quand on soumet le formulaire.

n°578056
Mara's dad
Yes I can !
Posté le 28-11-2003 à 10:06:43  profilanswer
 

Freekill a écrit :

Je suppose quand même qu'il y a des formulaires pour ajouter/modifier des trucs sur le site.
 
Il suffit de déterminer quelles sont les pages affectées par l'opération et de les regénérer quand on soumet le formulaire.


 
Tout simplement oui !
 
Dans ton interface d'administration, quand tu valide une modif, tu l'enregistre en base, et tu regénère la page HTML.
 
Pas besoin de le faire toutes les 5 minutes avec un cron :non:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°578058
gizmo
Posté le 28-11-2003 à 10:07:58  profilanswer
 

enfin! \o/

n°578358
KrisCool
“Verbeux„
Posté le 28-11-2003 à 16:02:04  profilanswer
 

Un petit article sur zend.com (qui au passage en contient plein d'autres très intéressants) : http://www.zend.com/zend/art/scriptcaching.php


---------------
Loose Change Lies | Bars | Last.fm
n°578687
moon06
Ignorance is bliss
Posté le 28-11-2003 à 22:25:20  profilanswer
 

Mara's dad a écrit :


 
Tout simplement oui !
 
Dans ton interface d'administration, quand tu valide une modif, tu l'enregistre en base, et tu regénère la page HTML.
 
Pas besoin de le faire toutes les 5 minutes avec un cron :non:  


 
ok, mais comment ? c'est ça en fait ma question dès le départ ... comment mettre à jour le cache d'une page depuis l'admin ...


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
n°578697
mrbebert
Posté le 28-11-2003 à 22:29:35  profilanswer
 

Je pense qu'il suffit de regénérer chaque page lorsqu'elle est modifiée :??:  
Par exemple, quand tu postes un message, ca regénère la page du topic correspondant. Du coup, tous les accès en lecture se font sur des pages "statiques" :)

n°578704
gizmo
Posté le 28-11-2003 à 22:41:26  profilanswer
 

bah oui, tout simplement. Tu gardes un moyen simple de faire la transcription DB<->url du fichier. Comme ça, tu détruit l'ancien et tu le remplaces par le nouveau.
 
Il ne faut pas toujours chercher midi à quatorze heure.

n°578894
forummp3
@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@
Posté le 29-11-2003 à 11:56:03  profilanswer
 

ca vous est jamais venu a l'idée qu'au moment de poster la news, la page html etait généré ?
vous savez, avec php on peut créé des fichiers avec fopen(), fwrite() etc.
Pour telecharger.com un jour l'admin avait dis qu'il generais les pages html sur son ordi de bureau a l'aide d'un script perl et qu'il uploadait le tout.
voila :)


---------------
lecteur mp3 yvele's smilies jeux de fille
n°578983
moon06
Ignorance is bliss
Posté le 29-11-2003 à 17:47:43  profilanswer
 

yep, je connais tout ça, je me demandais juste s'il y avait un autre moyen que de réécrire entièrement les pages à chaque fois ...


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
n°578986
forummp3
@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@
Posté le 29-11-2003 à 17:55:43  profilanswer
 

moon06 a écrit :

yep, je connais tout ça, je me demandais juste s'il y avait un autre moyen que de réécrire entièrement les pages à chaque fois ...

est tu au courant que php réécrit entierement la page a chaque fois que tu la charge? [:totozzz]


---------------
lecteur mp3 yvele's smilies jeux de fille
n°579138
moon06
Ignorance is bliss
Posté le 29-11-2003 à 23:15:16  profilanswer
 

bon, c'est pas grave, j'arrive pas a dire exactement ce que je voudrais lol !
 
je vais tester une idée ... [:yaisse2]


---------------
- Si les cons volaient, il ferait nuit tout le temps ! -
n°579143
Mara's dad
Yes I can !
Posté le 29-11-2003 à 23:18:27  profilanswer
 

moon06 a écrit :

bon, c'est pas grave, j'arrive pas a dire exactement ce que je voudrais lol !


 
T'es pas le seul : http://forum.hardware.fr/forum2.ph [...] 932&cat=10 :(


Message édité par Mara's dad le 29-11-2003 à 23:18:42

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°579405
mrbebert
Posté le 30-11-2003 à 14:08:40  profilanswer
 

mrBebert a écrit :

Je pense qu'il suffit de regénérer chaque page lorsqu'elle est modifiée :??:  
Par exemple, quand tu postes un message, ca regénère la page du topic correspondant. Du coup, tous les accès en lecture se font sur des pages "statiques" :)  

A la rigueur, il y a une autre approche qui est possible [:figti]  
Regénérer une page statique à chaque modification est adapté pour des pages qui sont plus souvent lues que modifiées (catalogue ...).
Dans le cas contraire, on peut aussi se contenter de supprimer la page statique à chaque modification. Et lors d'une lecture, on génère la page si elle n'existe pas, avant de la renvoyer.
Je pense que c'est mieux que de générer des pages qui seront  
invalidées avant d'être consultées :)  
(bon, c'est vrai que dans ce cas, on peut aussi se contenter de pages dynamiques [:proy] )


Message édité par mrbebert le 30-11-2003 à 14:09:39
n°579408
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 30-11-2003 à 14:14:46  profilanswer
 

karamilo a écrit :

n'oublions pas non plus l'url rewriting d'apache ...

à mon avis c'est plutôt ca

n°579409
bobe
Posté le 30-11-2003 à 14:14:56  profilanswer
 

Oublie pas que tu peux gérer aussi le comportement du cache client avec les en-têtes http appropriés.

n°598837
Lex
Posté le 29-12-2003 à 23:55:04  profilanswer
 

topic cool : FLAG !!!!
 
sinon j'utilise pour certains petits sites la solution de jpcache qui est très simple à configurer ;)

n°600546
Lex
Posté le 02-01-2004 à 03:59:39  profilanswer
 

KrisCool a écrit :

Un petit article sur zend.com (qui au passage en contient plein d'autres très intéressants) : http://www.zend.com/zend/art/scriptcaching.php
 


 
terrible ce petit script. :)
 
J'en ai profité pour rajouter la gestion du temps. Un peu à la barbare certes :D mais cela règle pas mal de questions que vous vous posiez ;) Pour que cela marche la différence pra rapport à l'original est qu'il faut appeler un fichier .php en non plus un .html ou bien que Apache interprète les .html comme contenant du PHP.
 

Code :
  1. <?php
  2. // TEMPS DE CACHE EN SECONDES
  3. $tcache = 5;
  4. // get the static HTML file's location  
  5. $cache_file = $REQUEST_URI;
  6. // find out the URL of the dynamic script  
  7. // which creates the static file.  
  8. $maker_URL = str_replace ( "/cache/" , "/" , $cache_file );
  9. $maker_URL = str_replace ( ".php" , "" , $maker_URL );
  10. $last_slash = strrpos ( $maker_URL , "/" );
  11. // find out the creating script's name  
  12. // and make sure it exists.  
  13. $script = substr ( $maker_URL , 0 , $last_slash ) . ".php";
  14. $find = $DOCUMENT_ROOT . $script;
  15. if ( !file_exists ( $find )) {
  16.     // if the file does not exist, show a  
  17. // File Not Found error -  
  18. echo ("Couldn't find $REQUEST_URI" );
  19. // you can put a nice page here...  
  20.     exit;
  21. // but don't forget to exit !  
  22. }
  23. // now parse the query string  
  24. // here, "_" means "=" and "__" means "&"  
  25. // These rules are just personal preferences  
  26. $query_str = "?" . substr ( $maker_URL , $last_slash+1 );
  27. $query_str = str_replace ( "__" , "&" , $query_str );
  28. $query_str = str_replace ( "_" , "=" , $query_str );
  29. // and now create the full maker_URL  
  30. $maker_URL = "http://" . $HTTP_HOST . $script . $query_str;
  31. // open the maker script and read its output  
  32. $read = fopen ( $maker_URL , "r" );
  33. if ( !$read ) {
  34.     echo ( "Could not open $maker_URL" );
  35.     exit;
  36. }
  37. $HTML_output = "";
  38. // read the HTML output while displaying it  
  39. while ($line = fgets ( $read , 256 )) {
  40.     $HTML_output.= $line;
  41.     echo $line;
  42. }
  43. fclose ( $read );
  44. $HTML_output .= "
  45. <?
  46. \$time1 = filemtime(\"".$DOCUMENT_ROOT.$cache_file."\" );
  47. \$time2 = time();
  48. \$time3 = \$time2-\$time1;
  49. if (\$time3>".$tcache." ) unlink(\"".$DOCUMENT_ROOT.$cache_file."\" );
  50. ?>
  51. ";
  52. // finally, save the HTML output  
  53. // in a cache file.  
  54. $write = fopen ( $DOCUMENT_ROOT . $cache_file , "w" );
  55. if ( !$write ) {
  56. // you might not have permission  
  57. // to write in that directory.  
  58.     echo ( "could not open $writefile for writing" );
  59.     exit;
  60. }
  61. // lock the write file and  
  62. // write all the HTML into it  
  63. if ( !flock ( $write , LOCK_EX + LOCK_NB )) {
  64. // for PHP version < 4.0.1  
  65. // change LOCK_EX to 2  
  66. echo ( "could not lock $writefile" );
  67.     exit;
  68. }
  69. fwrite ( $write , $HTML_output , strlen ( $HTML_output ) );
  70. flock ( $write , LOCK_UN );
  71. // release lock. For PHP version < 4.0.1  
  72. // change LOCK_UN to 3  
  73. fclose ( $write );
  74. ?>


Message édité par Lex le 02-01-2004 à 04:20:24
n°623885
Tentacle
Posté le 28-01-2004 à 15:18:07  profilanswer
 

Salut,
 
Je tiens à te signaler que flock est inéfficace si tu n'utilises pas fflush pour vider le buffer juste après fwrite. J'ai fait des tests et le fait d'oublier fflush créé des collisions si 2 scripts accèdent au même fichier en même temps.
 
Je profite de ton post pour demander si des gens ont des renseignements à propos de cette remarque dans la doc :
 

Citation :

flock() ne fonctionne pas sur NFS ou sur les autres systèmes de fichiers réseaux. Vérifiez la documentation de votre système d'exploitation pour plus de détails.  
 
Sur certains systèmes d'exploitation, flock() est implémenté au niveau processus. Lorsque vous utilisez une API multi-thread comme ISAPI, vous risquez de ne pas pouvoir avoir confiance en flock() pour protéger vos fichiers contre d'autres scripts PHP qui fonctionnent en paralelle sur d'autres thread du même serveur.  
 
flock() n'est pas supporté sur les vieux systèmes de fichiers comme FAT et ses dérivés, et elle retournera forcément FALSE sous ces environnement (ceci est particulièrement vrai pour les utilisateurs de Windows 98).


 
est-ce toujours d'actualité ? (par exemple sous Windows 2000 en FAT32 il n'y a pas de soucis)
Ces configurations sont-elles fréquentes chez les hébergeurs ?
 
Merci d'avance  :jap:

n°624392
seb-belfor​t
Posté le 28-01-2004 à 23:49:56  profilanswer
 

Voila j'ai fait une petite fonction qui tourne bien, essayez la :
 
 

Code :
  1. function &cache($fichier,$requete)
  2. {
  3. $expire = 30000; // en secondes
  4. if (file_exists($fichier) &&
  5.     filemtime($fichier) > (time() - $expire)) {
  6.     $records = unserialize(file_get_contents($fichier));
  7. } else {
  8.     include("connexion.inc.php" );
  9.     $result = mysql_query($requete)
  10.         or die (mysql_error());
  11.     while ($record = mysql_fetch_array($result) ) {
  12.         $records[] = $record;
  13.     }
  14.     $OUTPUT = serialize($records);
  15.     $fp = fopen($fichier,"w" );
  16.     fputs($fp, $OUTPUT);
  17.     fclose($fp);
  18. }
  19. return $records;
  20. }


et dans les fichiers php au lieu des requetes classiques tu passes a la fonction cache le fichier texte ou tu dois ecrire et ta requete :
 

Code :
  1. foreach ( (cache("sql.txt","SELECT * FROM table ORDER BY num DESC LIMIT 0,5" )) as $id=>$row)
  2. {
  3. echo $row["bidule"];
  4. }


 
J'espere que ça vous servira ...


Message édité par seb-belfort le 28-01-2004 à 23:51:47
n°624537
Lex
Posté le 29-01-2004 à 08:13:27  profilanswer
 

Tentacle > j'ai juste changé 5 lignes dans le script de Zend mais je suppose que tu as raison :D POur ta question je ne sais pas :(  
 
seb-belfort > cool, j'essaie ça dans la semaine !

n°624683
Tentacle
Posté le 29-01-2004 à 11:35:12  profilanswer
 

Peut-être que ce n'est pas nécéssaire ici remarque ...

n°624724
Lex
Posté le 29-01-2004 à 12:02:45  profilanswer
 

Tentacle a écrit :

Peut-être que ce n'est pas nécéssaire ici remarque ...


 
en fait le code suivant
 

Code :
  1. flock ( $write , LOCK_EX + LOCK_NB )
  2. ...
  3. flock ( $write , LOCK_UN );


 
permet justement de prendre puis de laisser la main sur le fichier, donc a priori pas de collisions, si c'est bien ça que tu te demandais :D

n°624767
Tentacle
Posté le 29-01-2004 à 12:24:15  profilanswer
 

Oui, il n'y aura pas de collision entre ces 2 appels de flock. Le problème est que PHP utilises un buffer quand tu écris dans un fichier et donc ce qui est envoyé par un fwrite par exemple n'est pas écrit immédiatement. Autre problème, tu ne peux dévérouiller un fichier que quand il est ouvert, donc entre le moment où tu le dévérouilles et celui où tu vas fermer ce fichier (et donc le moment où PHP va écrire dans le fichier ce qui est resté dans le buffer), un autre script peut vérouiller le fichier et y écrire.
Ce qui chez moi a entraîné des collisions (certes moins que sans flock mais tout de même). J'ai résolu le problème en utilisant fflush avant de dévérouiller le fichier.
 
Donc sauf à préciser quelquepart que PHP ne doit pas bufferisé les sorties, je pense que fflush est nécéssaire à l'efficacité de flock :)

n°625157
Lex
Posté le 29-01-2004 à 17:50:54  profilanswer
 

ok :jap:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  un site en PHP/MySQL avec seulement des pages HTML en cache !?!?

 

Sujets relatifs
Transformation XML/XSL -> HTML dans un web-browser (pas forcement IE)BINARY() de MySQL vraiment lent...
Sessions et MySQL...[ html ] donner de la couleur à "title"
appele desespéré pour inserer une date en mysqlediteur mysql
sequence en mysql[HTML] Thead
Comment qu'on fait en MySQL....[MYSQL] GRANT pour une plage d'@IP
Plus de sujets relatifs à : un site en PHP/MySQL avec seulement des pages HTML en cache !?!?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR