Forcer l'affichage durant un chargement de page php! - PHP - Programmation
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...
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
Marsh Posté le 13-09-2005 à 12:02:17
Oui c ca flush permet de forcé la sortie standard. ca devrais resoudre ton probleme
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.
Marsh Posté le 13-09-2005 à 12:23:24
ob_start(); et ses amis
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!
Marsh Posté le 13-09-2005 à 13:50:25
c'est que tu t'y prend mal..
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.
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!
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 ...
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
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 :
|
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!
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)
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()?
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.
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....)
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.
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