Forcer l'affichage durant un chargement de page php!

Forcer l'affichage durant un chargement de page php! - PHP - Programmation

Marsh Posté le 13-09-2005 à 11:38:12    


J'ai une page php qui demande un bonne dizaine de secondes pour se charger (quelque soit la vitesse de connection de l'utilisateur)  
 
disons qu'il y a dans cette page 5 fonctions (voir plus ) qui mettent 2secondes chaque , entre chacune j'ai mis un  
echo "fonction terminé"
 
et donc ce qui aurait permis de voir  l'avancement de la page
 
Malheureusement tous les echos s'affichent d'un coup et a la fin une fois que toute la page est chargé.  
 
Je voulais savoir s'il y  avait une technique pour forcer l'affichage sur le navigateur au milieu d'une page php!  
 
marci pour votre aide  
 

Reply

Marsh Posté le 13-09-2005 à 11:38:12   

Reply

Marsh Posté le 13-09-2005 à 11:56:47    

Ben tu mais juste la fonction "flush()" juste après chaque echo.
 
Ca donne donc
 
insturction.....
echo "Fonction terminé";
flush();
instructions...
 

Reply

Marsh Posté le 13-09-2005 à 11:58:18    

flush c'est le vidage du cache c'est bien ca?  
 
 
j'avais pas du tout pensé  je vais essayé ! merci

Reply

Marsh Posté le 13-09-2005 à 12:02:17    

Oui c ca flush permet de forcé la sortie standard. ca devrais resoudre ton probleme


Message édité par DEns91 le 13-09-2005 à 12:02:43
Reply

Marsh Posté le 13-09-2005 à 12:09:45    

ca marche pas le probleme est tjrs la ...

Reply

Marsh Posté le 13-09-2005 à 12:12:17    

en fait voila ce que dit  la fonction flush
 
flush
(PHP 3, PHP 4 , PHP 5)
 
flush -- Vide les buffers de sortie
Description
void flush ( void )
 
 
flush() vide les buffers de sortie de PHP et tous ceux que PHP utilisait (CGI, un serveur web, etc.). Cette fonction envoit réellement toutes les données préparées vers l'utilsateur.  
 
Note : flush() n'a aucun effet sur la bufferisation de votre serveur web ou du navigateur.  
 
De nombreux serveurs, essentiellement sous Windows, continueront à bufferiser l'affichage de votre script jusqu'à ce qu'il soit terminé, avant de transmettre les résultats à l'internaute.  
 
Des modules Apache comme mod_gzip utilisent leur propre bufferisation, ce qui fait que flush() n'enverra pas les données jusqu'au navigateur client immédiatement.  
 
Même le navigateur peut réaliser une bufferisation avant de l'afficher. Netscape, par exemple, met en cache le texte jusqu'à ce qu'il recoive une fin de ligne, ou une nouvelle et il ne va effectuer aucun affichage tant que les balises </table> ne seront pas toutes refermées.  
 
Certaines versions de Microsoft Internet Explorer ne commençeront l'affichage de la page qu'après avoir reçu 256 octets d'affichage. Cela vous obligera à envoyer des espaces supplémentaires pour afficher la page.  
 

Reply

Marsh Posté le 13-09-2005 à 12:22:32    

Ben je peux pas plus t'aidé. je sèche

Reply

Marsh Posté le 13-09-2005 à 12:23:24    

ob_start(); et ses amis


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 13-09-2005 à 12:25:03    

Essai ob_flush()

Reply

Marsh Posté le 13-09-2005 à 12:26:00    

c'est que je fais mais sans succès!  
 
je regarde dans laide php comment faire mais ca veut pas trop apparement!

Reply

Marsh Posté le 13-09-2005 à 12:26:00   

Reply

Marsh Posté le 13-09-2005 à 13:50:25    

c'est que tu t'y prend mal..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 13-09-2005 à 22:22:38    

faut plutôt voir dans la config d'apache. Y'a un mode qui envoit tout sans buffer mais c destiné au debug.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 14-09-2005 à 11:50:06    

esox_ch a écrit :

c'est que tu t'y prend mal..


 
apparemment c IE et mozilla qui empeche de voir au fur et a mesure...  
 
c bizarre c clair  
 
sinon je peux pas toucher a la config d'apache!
 
merci pour votre aide  
 
 
si vous connaissez une technique qui marche vraiment hésité pas!

Reply

Marsh Posté le 14-09-2005 à 11:57:35    

Heu non je pense pas que ce soit un probleme de navigateur .... Mais regarde dans la config d'apache ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 14-09-2005 à 13:44:50    

texaff a écrit :

si vous connaissez une technique qui marche vraiment hésité pas!


non vu que c'est un problème bien connu de buffer coté serveur ET coté client...
tu peux bidouiller en envoyant plein d'espaces ou de retours à la ligne pour forcer l'affichage, mais ça reste du bidouillage

Reply

Marsh Posté le 06-01-2006 à 11:42:56    

Bon voilà je fais un p'tit up sur ce topic parce que j'ai le même problème et que tout ce que je trouve sur le forum ne m'aide pas.....
 
En fait ce que veut mon patron c'est un message d'attente, du genre "Opération en cours, veuillez patienter...." étant donné qu'on a une boucle qui prend énormément de temps à se terminer (>1min!) et que les client ont une certaine tendance à cliquer sur actualiser ce qui pose donc quelques problèmes....
 
On peut penser à réduir le temps que prend la boucle à se terminer mais croyez bien que lorsque vous devez créer un fichiers texte à partir de plusieurs tables qui contiennent entre 30'000 et 40'000 enregistrement chacune ba on peut faire ce qu'on veut, optimiser au plus point, ca prend quand même du temps!
 
Bon mon bout de code est assez simple, je vous la fait sans feuille de style et en un peu moche mais c'est juste pour donner un exemple pour que ce que je raconte soit un peu plus clair :
 

Code :
  1. [...]
  2. <html>
  3. <head>
  4. [...]
  5. <STYLE TYPE="text/css">
  6. <!--
  7. #cache {
  8. /* Message d'attente masqué par défaut */
  9.     visibility:hidden;
  10.     position:absolute;
  11.     top:20px;
  12.     left:10px;
  13. }
  14. -->
  15. </head>
  16. <body>
  17. <p ID="cache" align="center">Opération en cours, veuillez patienter...</p>
  18. <script type="text/javascript">
  19. // Le message d'attente est masqué par défaut au cas ou java script
  20. // serait désactivé sur le navigateur client donc on l'affiche :
  21. document.getElementById("cache" ).style.visibility = "visible";
  22. </script>
  23. <?
  24. ob_flush();
  25. flush();
  26. // Ma boucle ultra longue
  27. [...]
  28. ?>
  29. La fin du code et on masque le message puisque la boucle est terminée:
  30. <script type="text/javascript">
  31. document.getElementById("cache" ).style.visibility = "hidden";
  32. </script>
  33. </body>
  34. [...]


 
Alors ca marche sans problème en local (serveur Windows, pas touché à la config). Maintenant le problème c'est quand je test le script sur notre beau serveur dédié... Ba ca marche pas!
 
Bon au moins avec un dédié on a l'avantage de pouvoir modifier la config, par exemple de désactiver l'utilisation des buffers, mais comme il l'a été dit, c'est pour du debug et non de la prod.
 
Donc j'ai cherché côté config apache et php (j'ai pas cherché côté MySQL, je pense pas que ca vienne de là) mais à part cette désactivation des buffurs comme je le disais je n'ai rien trouvé, cherché sur internet et le forum mais rien trouvé non plus.... Et j'en ai marre.... Quelqu'un a-t-il une solution???
 
D'avance, merci! :D


Message édité par dwogsi le 06-01-2006 à 12:19:46

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-01-2006 à 12:17:07    

Il y a la technique bourine du "script qu'on lance", qui cré un fichier de status temporaire et qui renvoit une instruction de changement d'adresse au navigateur. Ensuite, tant que ce script est pas terminé, ce fichier contiendra un texte donner, par exemple l'avancement de l'exécution. Une fois le traitement terminé, le fichier contiendra l'adresse où se trouve le résultat.
 
De son côté, le navigateur va avoir apellé un second script qui vérifira l'avancement et qui le fera suivre au navigateur (page "traitement en cours" avec une barre d'avancement par exemple) avec une instruction de refresh pour que le navigateur redemande la même page au bout de quelques temps pour pouvoir voir où ca en est.
 
 
 
Personellement, je n'ai jamais eu besoin d'un tel ensemble mais j'ai déjà vu des sites qui le faisaient. (la SNCF par exemple)


Message édité par omega2 le 06-01-2006 à 12:17:58
Reply

Marsh Posté le 06-01-2006 à 12:28:12    

Hummm.. Sincérement? J'ai pas bien compris ce que tu voulais expliqer, pardon...
 
Mais je suis quand même allé voir le site de la SNCF puisque j'y avait vu en faisant des recherches d'horaires la page "Votre recherche est encours..." (si c'est bien de là que tu parlais), donc tu voulais dire une sorte de page intermédiaire???
 
Sinon je me demandais, étant donné qu'on peut touché à la config, y-a-t-il une option, un paramètre ou je ne sais quoi encore qui peut changer le comportement des fonctions flush() et ob_flush()?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-01-2006 à 12:40:23    

Oui, c'est bien ce principe dont je parlais. La fameuse "votre recherche est en cours..." qui laisse le temps au serveur de finir de rechercher les informations sans risquer de voir tomber le navigateur en timeout par ce que malheureusement, dans le tas, une étape se serait révélé plus longue que prévus.

Reply

Marsh Posté le 06-01-2006 à 12:46:46    

C'est bien ce que je craignais.... Parce que... Je reprends ce qui a té fait par d'autres! Et conception (pardonnez moi l'expression) merdique à souhait.  
 
Et oui insérer une page intermédiaire ça va prendre beaucoup, beaucoup, beaucoup de temps je pense! Mais bon si c'est l'ultime solution alors tant pis je l'adopterais...
 
(Tiens je viens de voir que ça fait un an jour pour jour que je suis inscrit sur le forum! lol aucune importance je sais... Youpi!!! Oui oui je perd la tête et pire encore je remplie actuellement la base de donnée de HFR pour rien....)


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 08-01-2006 à 18:03:07    

Sinon y'a l'alternative AJAX. Une page contenant le code javascript qui appelle les autres pages à la suite les unes de autres par de htmlrequest et qui gère les messages d'attente entre chaque résultat.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed