Affichage progressif [Résolu]

Affichage progressif [Résolu] - PHP - Programmation

Marsh Posté le 12-08-2004 à 09:29:28    

J'ai besoin d'aide...
 
Pour une appli, j'ai besoin de créer plusieurs images et de les envoyer par mail ensuite.
 
J'ai tout le code pour faire cela, mais j'ai quelques soucis.
 
Lorsque je crée les images, elles ne sont pas crées dans la seconde j'imagine sur le serv, donc la suite du code qui est sensée envoyer l'email n'arriver par à envoyer toutes les images, certaines sont manquantes...
 
J'ai essayé de faire un affichage progressif avec des <table> pour la création des images, puis un delay(5), mais ca ne sert à rien, rien ne s'affiche avant que le script soit complété (je suis à l'intérieur d'une fonction)...
 
Alors Je ne sais pas trop comment m'y prendre. Soit je scinde en 2 scripts exécutés à des h différentes (mauvaise solution), soit je trouve une manière de faire afficher les données puis de prendre en compte mon delay ensuite...
 
Si vous pouviez m'aider...
 
Pour le moment la création d'image se passe ainsi : appel dans un <img src> d'un image.php3 qui fait la création. J'ai essayé de faire plutot un include, mais ca ne fonctionne pas...
 
So, please help ;)
 
NEW QUESTION
 
En somme, ce que je veux savoir, c'est comment php peut afficher progressivement les "echo" de mon code php. Par exemple j'ai des echo, un "sleep(5);" puis des echo. Je veux que les premiers echos s'affichent. Il n'y a pas de tableau, il y a rien. c'est du texte tout ce qu'il ya de plus bete !
 
MEGA HELP PLEASE !!


Message édité par kowalski le 13-08-2004 à 13:09:27
Reply

Marsh Posté le 12-08-2004 à 09:29:28   

Reply

Marsh Posté le 12-08-2004 à 10:42:45    

Normalement la creation d'image est instantanée ... il ne me semble pas que le code qui se trouve après la portion de creation ne s'execute avant que celle ci soit terminée ...


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2004 à 12:10:15    

Il y a bcp d'images à créer, et tout ce que je fais, c'est des img src, donc pour mon fichier php, qui appelle les images, il passe à l'envoi d'email sans réellement savoir si les images ont été crées... Je m'exprime peut etre super mal en fait ;)

Reply

Marsh Posté le 12-08-2004 à 12:12:44    

Euh, nan là j'avoue que j'ai du mal à suivre :( Désolé


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2004 à 12:19:50    

Je reexplique.
J'ai un code php qui appelle plusieurs fois la création d'image, en faisant <img src=image.php?param>. Directement dans la suite du code principal, ces fichiers, créés par les image.php3 sont ajoutés comme pieces jointes à un mail. Hors souvent, certains de ces fichiers n'ont pas encore tous été créés par mes image.php tu suis ? En somme je voudrais soit, pouvoir afficher mes <img src> dès le départ, puis mettre un delay de 5sec, soit les lancer avec un include ou qqch qui me permet d'etre sur que les fichiers ont été créés avant de passer à l'envoi du mail...

Reply

Marsh Posté le 12-08-2004 à 23:38:13    

En somme, ce que je veux savoir, c'est comment php peut afficher progressivement les "echo" de mon code php. Par exemple j'ai des echo, un "sleep(5);" puis des echo. Je veux que les premiers echos s'affichent. Il n'y a pas de tableau, il y a rien. c'est du texte tout ce qu'il ya de plus bete !

Reply

Marsh Posté le 13-08-2004 à 02:38:20    

Salut,  
j'ai connu les mêmes problèmes pour mon site qui doit creer des thumbs puis les envoyer sur des mirroirs distants et donc pour répondre à certains NON la creation d'image n'est pas instantanée (ok c'est instantané si on a un Xeon 3.06Ghz et 2Gb de ram..) bref,
 
soit tu as une version récente de php et tu as :    PHP 4 >= 4.1.0, PHP 5) pcntl_waitpid -- Attend la fin de l'exécution d'un processus fils
 
cette fonction là devrait t'être utile, moi je sais que j'ai une version plus ancienne sur mon serveur, j'ai donc feinté. J'ai requp les PID des process qui tranforment les images et j'attend qu'ils soient terminés. (le serveur est bien évidemment sous unix)
 
j'utilise ça: while(exec('/bin/bash -c "/bin/ps -aux | grep '.$shell_pid.' | grep -v grep | wc -l"') != 0) { echo '.'; sleep(2); }
et on règle le sleep en fonction de la rapidité (là c'est pour envoyer sur les mirroirs distant donc comme mon up est assez limité ça sert à rien de boucler toutes les 10ms donc 2s ça reste correct et pas trop lent..)
 
voilà avec ça ça marche nickel, pas trop de charge CPU et au moins les scripts avancent à leur vitesse...
 
J'espère avoir pu t'aider
 

Reply

Marsh Posté le 13-08-2004 à 08:24:44    

Je ne disais pas que la création est instantannée dans le sens (hop, en 0.0001 seconde l'image est créée) mais dans le sens que le script ne continue pas à s'executer tant que l'image n'est pas créée ...
 
Perso je viens d'essayer une boucle de création d'image en 640x480 qui vient de m'en créer 60 pour les réutiliser justre après, dans le meme script ... et ça passe... et mon serveur est loin d'etre un Xeon Machintruk ... c'est un pov' Pentium 3 ...


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-08-2004 à 10:33:30    

Le souci c'est que image.php est totalement disjoint du script de la page principale. Cela revient donc au bon vouloir du navigateur pour appeler image.php
 
Il arrive donc que ton script principal soit terminé (avec l'envoi des mails) avant que tous les appels de image.php ne soient faits. Les processus sont diférents et n'ont donc aucun lien.
 
La seule chose que je te conseille, c'est d'intégrer le traitement d'image.php dans la même page que ton script principal.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 13-08-2004 à 11:01:14    

Nononon, pas chez moi... En effet je sais pas comment réagit php dans ces cas là mais chez moi il "passait" sa route même si c'était pas vraiment terminé..
ex un exec(); n'était pas encore terminé, bah il continuait.. j'ai trouvé ce comportement assez bizarre et je n'ai jamais pu l'expliquer, mais en tout cas ça marchait pas  :sweat:

Reply

Marsh Posté le 13-08-2004 à 11:01:14   

Reply

Marsh Posté le 13-08-2004 à 12:26:17    

Peut etre que je susi à l ouest mais les fonctions ob_ peuvent peut etre t aider.

Reply

Marsh Posté le 13-08-2004 à 12:29:34    

ob_* (start, flush) servent à l'affichage et non au traitement du script en lui même.. d'ailleurs j'ai jamais *vraiment* reussis à les faire fonctionner. si quelqu'un à a me montrer un exemple qui marche j'suis prenneur...

Reply

Marsh Posté le 13-08-2004 à 12:31:02    

T509 a écrit :

Le souci c'est que image.php est totalement disjoint du script de la page principale. Cela revient donc au bon vouloir du navigateur pour appeler image.php
 
Il arrive donc que ton script principal soit terminé (avec l'envoi des mails) avant que tous les appels de image.php ne soient faits. Les processus sont diférents et n'ont donc aucun lien.
 
La seule chose que je te conseille, c'est d'intégrer le traitement d'image.php dans la même page que ton script principal.


 
Le petit problème c'est que j'appelle une image grace à img src. Si je fais un include, il me dis que les headers ont déjà été envoyés... Vous avez une idée à ce sujet ?

Reply

Marsh Posté le 13-08-2004 à 12:33:50    

montre le code, parce que là c'est plutôt flou.. normalement un <img src=> </img> dans un bête <body></body> ça nécessite pas trop les headers hein... sinon tu as regardé du côté du pcntl_waitpid ?

Reply

Marsh Posté le 13-08-2004 à 12:35:14    

b4ckUp a écrit :

ob_* (start, flush) servent à l'affichage et non au traitement du script en lui même.. d'ailleurs j'ai jamais *vraiment* reussis à les faire fonctionner. si quelqu'un à a me montrer un exemple qui marche j'suis prenneur...


 
création d'un pdf, meme si le code va pas vraiment t'aider.
 

Code :
  1. ob_start();
  2.         $pdf = new Reponse();
  3.         $pdf->Open();
  4.         $pdf->AliasNbPages();
  5.         $pdf->definitionFont();     
  6.         $pdf->lettre_reponse($_SESSION["id_reclamation"], $dispo_pages, $tab_lettre, $qualite, $_SESSION['destrep']);
  7.         $string = ob_get_clean();


Message édité par Sebastien le 13-08-2004 à 12:38:25
Reply

Marsh Posté le 13-08-2004 à 12:37:09    

b4ckUp a écrit :

montre le code, parce que là c'est plutôt flou.. normalement un <img src=> </img> dans un bête <body></body> ça nécessite pas trop les headers hein... sinon tu as regardé du côté du pcntl_waitpid ?


 
Non, tu as posté au même moment que moi, je vais jetter un coup d'oeil là...
<img src=image.php></img>. Ce image.php crée une image, ok ?
Sauf que si je fais indlude("image.php" ); l'image ne se crée pas, car les headers de la page qui appelle image.php ont déjà été envoyés.

Reply

Marsh Posté le 13-08-2004 à 12:38:23    

Sebastien a écrit :

création d'un pdf, meme si le code va pas vraiment t'aider.


pas vraiment non  :heink: !
 
mais bon, je cherchais plutôt à balancer un truc du style "Patientez on traite votre requête" mais chez moi, ça l'envoie juste avant qu'il rafrachisse la page. explication
 
on lance la requête qui est *longue* y'a l'écran blanc/la même page (ça dépend ie/firefox) et puis après en 1s y'a mon message qui s'affiche, puis la nouvelle page (donc la requête est terminée..) qui s'affiche..
 
en gros ça n'a servi à rien le ob_start(); quoi..

Reply

Marsh Posté le 13-08-2004 à 12:39:11    

kowalski a écrit :

Non, tu as posté au même moment que moi, je vais jetter un coup d'oeil là...
<img src=image.php></img>. Ce image.php crée une image, ok ?
Sauf que si je fais indlude("image.php" ); l'image ne se crée pas, car les headers de la page qui appelle image.php ont déjà été envoyés.


tu envoies des headers dans image.php? montre le début du script..

Reply

Marsh Posté le 13-08-2004 à 12:39:15    

-> je reviens, je vais dejeuner, merci d'essayer de m'aider je suis à vous dans 15 mn

Reply

Marsh Posté le 13-08-2004 à 12:40:28    

Ben ca peut servir aussi par exemple si tu as un tres tres long tableau qui doit s afficher et que tu veux pas qu'il s'affiche etape par etape.
Tu lances ton ob_start et à la fin tu le termines, comme ca tout s'affiche d'un coup et juste avant tu peux mettre ton petit message de patience.

Reply

Marsh Posté le 13-08-2004 à 12:41:52    

oui, sauf que chez moi ça marche pas comme je veux :)
 
okay bonap' à toi.


Message édité par b4ckUp le 13-08-2004 à 12:43:07
Reply

Marsh Posté le 13-08-2004 à 12:46:46    

regarde mon code..  

Code :
  1. if(strlen(trim($_REQUEST['motsclef'])) > 0 && !isset($_GET['id'])) {
  2.  ob_start();
  3.  include('wait.htm');
  4.  ob_end_flush();
  5.  ob_start();
  6.                  [....] code du moteur de recherche.. la requête étant longue on balance wait.htm en attendant..
  7. include('endwait.htm');
  8. echo '<br><a href="index.php">faire une nouvelle recherche</A>';
  9. }


voilà j'ai testé ça et bon bah j'ai pas le wait.htm qui s'affiche, sauf à la toute fin et encore 1fois sur 20... j'dois mal l'utiliser..

Reply

Marsh Posté le 13-08-2004 à 13:08:52    

Je suis désolé, je viens de comprendre mon idiotie...
 
En fait en fonction des paramètres, le fichier image.php crée une image visible par le navigateur ou la crée sur le serv... Et comme un idiot, j'envoyais les headers avant de savoir si l'image allait etre crée physiquement ou non..
 
En somme, image.php envoyait des headers au navigateur meme si l'image ne devait pas d'afficher...
 
l'erreur était con, j'ai mis des heures à la voir...
 
Désolé... :'(
 
PS : à la base je pensais qu'en créant le fichier sur le serveur, elle serait également affichée, mais en lisant bien la doc de php.net, j'ai compris...

Reply

Marsh Posté le 13-08-2004 à 13:10:38    

Enfin, j'ai reglé mon probleme comme cela, mais ca ne change rien au fait qu'il ne m'affiche pas progressivement mon tableau par exemple... Evidemment j'ai trouvé une parade "propre" à cela, mais bon, ca m'intéresse !

Reply

Marsh Posté le 13-08-2004 à 13:18:30    

kowalski a écrit :

Je suis désolé, je viens de comprendre mon idiotie...
 
En fait en fonction des paramètres, le fichier image.php crée une image visible par le navigateur ou la crée sur le serv... Et comme un idiot, j'envoyais les headers avant de savoir si l'image allait etre crée physiquement ou non..
 
En somme, image.php envoyait des headers au navigateur meme si l'image ne devait pas d'afficher...
 
l'erreur était con, j'ai mis des heures à la voir...


c'est malin  :pt1cable: ! mais bon c'est souvent comme ça que ça se passe.. y'a 3jours j'ai mis 1h à *débug* un truc qui *marchait* mais bon le temps de comprendre que j'étais bête.. Bah pour le ob_start(); j'sais pas, j'ai jamais reussis à le faire vraiment marcher. yapluka attendre sebastien  :jap:

Reply

Marsh Posté le 13-08-2004 à 13:30:16    

Na je vais pas trop m avancer peur de dire des conneries ;-)
je m'en sers pour eviter certains affichages apres j'en ai pas forcement eu la meme utilisation.
 
Generalement je m'en sers pour construire une page et apres si je m'apercois qu'il y a un soucis quelque part, hop je lance un header, ce qui me permet de pas avoir de probleme.

Reply

Marsh Posté le 13-08-2004 à 13:37:37    

Sebastien a écrit :

Na je vais pas trop m avancer peur de dire des conneries ;-)


 
bon bha tantpis  :sweat:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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