Afficher une page morceau par morceau

Afficher une page morceau par morceau - PHP - Programmation

Marsh Posté le 03-06-2005 à 15:13:51    

Bonjour
 
Je cherche une astuce qui me permettrait d'afficher une page PHP au fur et à mesure que le script s'execute côté serveur. Mon script traite des fichiers et peut durer une trentaine de secondes. Je veux que l'utilisateur puisse lire quelque chose comme :
 
Fichier 1 traité
Fichier 2 traité
... Une ligne s'ajoutant à chaque fois.
 
J'ai cherché du côté de la gestion du buffer mais rien ne permet de forcer l'envoi d'une partie de la page.
 
 
Disons que je travaille sur le script suivant :  
 

Code :
  1. for ($i=0;$i<50;$i++) {
  2.    echo "<br>Fichier ".$i." Traité";
  3.    sleep(1); // pause d'une seconde
  4. }


 
 
Voila si vous voyez une solution :p

Reply

Marsh Posté le 03-06-2005 à 15:13:51   

Reply

Marsh Posté le 03-06-2005 à 15:16:30    

peut être en fesant un ob_flush() avant ton sleep ...

Reply

Marsh Posté le 03-06-2005 à 15:51:20    

GaSPaRD77 a écrit :

peut être en fesant un ob_flush() avant ton sleep ...


 
J'ai testé, mais ça ne fonctionne pas.  
 
Dites moi si je me trompe, mais j'ai l'impression que la gestion du buffer par ob_start(), ob_flush() etc ne permet pas de forcer l'envoi de la page vers le client, uniquement de le retenir ou le modifier.

Reply

Marsh Posté le 03-06-2005 à 15:53:16    

ob_start();
blablabla
$page = ob_get_contents();
ob_end_flush();
echo $page; // blablabla
 
ptet ca t'aidera

Reply

Marsh Posté le 03-06-2005 à 16:03:03    

benamoubeach a écrit :

ob_start();
blablabla
$page = ob_get_contents();
ob_end_flush();
echo $page; // blablabla
 
ptet ca t'aidera


 
Merci pour ton aide, mais ça ne libère pas l'envoi de la page au client. Le ob_end_flush() laisse la page côté serveur jusqu'à la fin de l'execution du script. Je suppose que c'est uniquement quand les pages sont volumineuses qu'un envoit se fait avant la fin du chargement de la page.
 
Voila ce que j'ai testé :

Code :
  1. for ($i=0;$i<500;$i++) {
  2.            ob_start();
  3.            echo "blablabla";
  4.            $page = ob_get_contents();
  5.            ob_end_flush();
  6.            echo $page;
  7.            sleep(1);
  8.    }


 
Existerait-il une fonction php ou un header qui définit la taille de découpage de la page entre deux transmissions de données ?

Reply

Marsh Posté le 03-06-2005 à 16:05:23    

sinon tu peux le faire en javascript :) avec un setTimeout. Sinon je ne pense pas que tu puisses

Reply

Marsh Posté le 03-06-2005 à 16:08:09    

benamoubeach a écrit :

sinon tu peux le faire en javascript :) avec un setTimeout. Sinon je ne pense pas que tu puisses


 
Le temps entre deux affichages dépend de la vitesse du traitement du fichier par le serveur, donc le javascript ça serait un peu de l'arnaque :p

Reply

Marsh Posté le 03-06-2005 à 16:09:06    

non , car le settimeout commence a partir du moment ou la page a été totalement chargée :)
un mec qui a bossé 2 ans en javascript me l'a dit donc j'ai confiance :)

Reply

Marsh Posté le 03-06-2005 à 16:16:48    

benamoubeach a écrit :

non , car le settimeout commence a partir du moment ou la page a été totalement chargée :)
un mec qui a bossé 2 ans en javascript me l'a dit donc j'ai confiance :)


 
Oui et il a raison :p Sauf que je souhaite agir sur le chargement de la page. Le sleep(1) que je donne dans mon exemple sera remplacé par un temps qu'on ne connaît pas à l'avance, et que javascript ne pourra pas connaître à l'avance.

Reply

Marsh Posté le 03-06-2005 à 16:30:05    

ah pardon j'avais pas bien compris ce que tu voulais faire :)

Reply

Marsh Posté le 03-06-2005 à 16:30:05   

Reply

Marsh Posté le 09-06-2005 à 17:42:59    

J'ai toujours besoin d'une solution, je prends toutes vos idées :)

Reply

Marsh Posté le 09-06-2005 à 17:49:05    

écris plein de chose entre chaque fichier  :)

Reply

Marsh Posté le 09-06-2005 à 18:31:06    

flush() tout court non ?

Reply

Marsh Posté le 13-06-2005 à 15:20:06    

nulloz a écrit :

flush() tout court non ?


 
 
Merci beaucoup Nullzod, je comprends pas comment j'ai pu passer à côté de cette fonction dans la documentation php :D
 
Ca marche presque à la perfection, voici la page pour mon exemple :
 

Code :
  1. ob_start();
  2.    for ($i=0;$i<500;$i++) {
  3.            echo "<br>blablabla";
  4.            flush();
  5.            ob_flush();
  6.            sleep(1);
  7.    }
  8.    ob_end_flush();


 
 
Je vais tout de suite me mettre au boulot :p

Reply

Marsh Posté le 10-07-2005 à 18:45:10    

j'ai essayé le code de lukos sur mon serveur local et chez moi ca marche pas ? les lignes 'blablabla' s'affiche toute en meme tant!
 
Ma config: serveur apache2, php 4.3, mysql 4.0. j'ai essayé avec firefox 1.0.2 et konqueror et rien? Je doit peut-être activer quelque chose mais où?

Reply

Sujets relatifs:

Leave a Replay

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