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

  FORUM HardWare.fr
  Programmation
  PHP

  Forcer l'affichage durant un chargement de page php!

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Forcer l'affichage durant un chargement de page php!

n°1198344
texaff
Posté le 13-09-2005 à 11:38:12  profilanswer
 


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  
 

mood
Publicité
Posté le 13-09-2005 à 11:38:12  profilanswer
 

n°1198381
DEns91
Posté le 13-09-2005 à 11:56:47  profilanswer
 

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

n°1198386
texaff
Posté le 13-09-2005 à 11:58:18  profilanswer
 

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

n°1198390
DEns91
Posté le 13-09-2005 à 12:02:17  profilanswer
 

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
n°1198396
texaff
Posté le 13-09-2005 à 12:09:45  profilanswer
 

ca marche pas le probleme est tjrs la ...

n°1198398
texaff
Posté le 13-09-2005 à 12:12:17  profilanswer
 

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.  
 

n°1198402
DEns91
Posté le 13-09-2005 à 12:22:32  profilanswer
 

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

n°1198404
esox_ch
Posté le 13-09-2005 à 12:23:24  profilanswer
 

ob_start(); et ses amis


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1198405
DEns91
Posté le 13-09-2005 à 12:25:03  profilanswer
 

Essai ob_flush()

n°1198407
texaff
Posté le 13-09-2005 à 12:26:00  profilanswer
 

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

mood
Publicité
Posté le 13-09-2005 à 12:26:00  profilanswer
 

n°1198446
esox_ch
Posté le 13-09-2005 à 13:50:25  profilanswer
 

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
n°1198895
Ricco
Retour au pays
Posté le 13-09-2005 à 22:22:38  profilanswer
 

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
n°1199218
texaff
Posté le 14-09-2005 à 11:50:06  profilanswer
 

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!

n°1199241
esox_ch
Posté le 14-09-2005 à 11:57:35  profilanswer
 

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
n°1199321
soju
One shot !
Posté le 14-09-2005 à 13:44:50  profilanswer
 

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

n°1278086
dwogsi
Défaillance cérébrale...
Posté le 06-01-2006 à 11:42:56  profilanswer
 

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})/
n°1278117
omega2
Posté le 06-01-2006 à 12:17:07  profilanswer
 

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
n°1278128
dwogsi
Défaillance cérébrale...
Posté le 06-01-2006 à 12:28:12  profilanswer
 

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})/
n°1278141
omega2
Posté le 06-01-2006 à 12:40:23  profilanswer
 

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.

n°1278143
dwogsi
Défaillance cérébrale...
Posté le 06-01-2006 à 12:46:46  profilanswer
 

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})/
n°1279179
Ricco
Retour au pays
Posté le 08-01-2006 à 18:03:07  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  Forcer l'affichage durant un chargement de page php!

 

Sujets relatifs
Retour à la ligne sous IE qui sabote la mise en page.affichage d'une applet [resolu]
Défaut d'affichage dans les imagesLiens paramètré vers une page de cadres ?
Comment passer un chiffre a virgule sur une autre page?empêcher le chargement d'une image dans le cache du navigateur
forcer un casting ? [résolu]Liens de différentes couleurs dans une même page html
mise en page / et autre questionmise en page avant impression
Plus de sujets relatifs à : Forcer l'affichage durant un chargement de page php!


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