Foros del Web » Programando para Internet » PHP »

Mostrar resultados en cada iteración del bucle y no al final

Estas en el tema de Mostrar resultados en cada iteración del bucle y no al final en el foro de PHP en Foros del Web. Buenas, Tengo un script con un bucle que llama a una función que inserta datos en la base de datos. Sin embargo, no lo imprime ...
  #1 (permalink)  
Antiguo 14/06/2010, 09:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Mostrar resultados en cada iteración del bucle y no al final

Buenas,

Tengo un script con un bucle que llama a una función que inserta datos en la base de datos.
Sin embargo, no lo imprime por pantalla los resultados hasta que no lo finaliza por completo el bucle, a pesar de tener ECHO's dentro del bucle!!!!. Es como si lo guárdese en memoria todo no?

Código PHP:
Ver original
  1. foreach ($ligas as $competicion){
  2.     echo "Analizando: $competicion<br/>";
  3.     preg_match_all("|\/country\/\d\/(.*)|", "$competicion",$salida);
  4.     $nombrePais=$salida[1][0];
  5.     echo "Competición: <strong>$nombrePais</strong><br/>";
  6.     preg_match_all("|\/country\/(\d*)\/|", "$competicion",$salida);
  7.     $idpais=$salida[1][0];
  8.     $res=Obtener_Resultados($competicion,$idpais,$db);
  9.     echo "<br/><br/>";
  10. }


Se puede hacer que vaya imprimiendo por pantalla la salida de cada iteración, sin tener que esperar a la última para mostrar el resultado?

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 14/06/2010, 09:36
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Revisa la información de flush
en la Documentacion de PHP

saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 14/06/2010, 09:43
 
Fecha de Ingreso: octubre-2007
Mensajes: 87
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

PHP es un lenguaje de servidor, por lo tanto, NO mostrara nada por pantalla hasta que no complete la pagina entera y la envíe al cliente (PC que ve la pagina)

Lo que puedes hacer, es usar AJAX para hacer algo parecido a lo que quieres
  #4 (permalink)  
Antiguo 14/06/2010, 09:48
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Cita:
Iniciado por xlokyx Ver Mensaje
PHP es un lenguaje de servidor, por lo tanto, NO mostrara nada por pantalla hasta que no complete la pagina entera y la envíe al cliente (PC que ve la pagina)

Lo que puedes hacer, es usar AJAX para hacer algo parecido a lo que quieres
repito que lean la documentacion de flush()
__________________
More about me...
~ @rhyudek1
~ Github
  #5 (permalink)  
Antiguo 14/06/2010, 09:52
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

si, no sean tercos...

por favor, hay que leer la documentación!!
http://php.net/flush
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 14/06/2010, 09:55
 
Fecha de Ingreso: octubre-2007
Mensajes: 87
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

el mensaje lo empece a escribir cuando aun no había respuestas, y no conocía esa función ¬¬
siempre se aprenden cosas nuevas ;)
  #7 (permalink)  
Antiguo 14/06/2010, 11:48
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

He probado varios ejemplos de la pagina del manual pero en todos me muestra la salida final...

Código PHP:
Ver original
  1. <?php
  2. print "[";
  3.  
  4. for($i = 0; $i < 100; $i++){
  5.   $spaces.=" ";
  6. } // for
  7.  
  8. //and then
  9.  
  10. for($i = 0; $i < 10; $i++){
  11.   for($ii = 0; $ii < 2000000; $ii++){
  12.     //do something slow here
  13.   } // for
  14.   print "$spaces|";
  15.   flush();
  16. } // for
  17.  
  18. print "]";
  19.  
  20. ?>

Y en mi ejemplo he puesto flush despues de cada echo y nada... lo muestra todo de golpe cuando acaba, tengo que activar o desactivar algo en el php.ini?

Lo hago mal?

Código PHP:
Ver original
  1. foreach ($ligas as $competicion){
  2.     echo "Analizando: $competicion<br/>";
  3.     flush();
  4.     preg_match_all("|\/country\/\d\/(.*)|", "$competicion",$salida);
  5.     $nombrePais=$salida[1][0];
  6.     echo "Competición: <strong>$nombrePais</strong><br/>";
  7.     flush();
  8.     preg_match_all("|\/country\/(\d*)\/|", "$competicion",$salida);
  9.     $idpais=$salida[1][0];
  10.     $res=Obtener_Resultados($competicion,$idpais,$db);
  11.     flush();
  12.     echo "<br/><br/>";
  13. }
  #8 (permalink)  
Antiguo 14/06/2010, 14:52
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Alguien puede ejecutar este código y decirme si le funciona el método flush()?

Código PHP:
Ver original
  1. <?php
  2. // All you need is 256 spaces first
  3. echo str_repeat(" ", 256)."<pre>"; flush();
  4.  
  5. // and ANY TAG before \r\n
  6. echo "working...<br/>\r\n"; flush(); sleep(5); // this in cycle
  7. echo "hola<br/>\r\n"; flush();sleep(5);
  8. echo "adios<br/>\r\n";
  9. ?>

Debería escribir Working por pantalla parar 5 segundos, seguir escribiendo hola por pantalla, parar 5 segundos y terminar con un adios.

Cuando lo ejecuto se pone a cargar no muestra nada hasta que termina y escribe las 3 lineas seguidas

Alguien lo puede probarrrrrrrrr?

Muuuchas gracias!
  #9 (permalink)  
Antiguo 14/06/2010, 15:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Revisa en tu php.ini el valor que tienes para output_buffering, para que funcione tu script, el output_buffering debe de estar en Off.

Saludos.
  #10 (permalink)  
Antiguo 14/06/2010, 15:46
Avatar de xalupeao  
Fecha de Ingreso: mayo-2008
Ubicación: Santiago, Chile
Mensajes: 749
Antigüedad: 16 años
Puntos: 12
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Lo probe en mi localhost y anda perfecto. Sin problemas, tengo instalado xampp para las pruebas.
__________________
Hosting en Chile en Silverhost - La solución en Hosting en Chile.
  #11 (permalink)  
Antiguo 14/06/2010, 16:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Cita:
Iniciado por GatorV Ver Mensaje
Revisa en tu php.ini el valor que tienes para output_buffering, para que funcione tu script, el output_buffering debe de estar en Off.

Saludos.
Lo tengo en OFF

Código:
; Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit.  You can enable output buffering during runtime by calling the output
; buffering functions.  You can also enable output buffering for all files by
; setting this directive to On.  If you wish to limit the size of the buffer
; to a certain size - you can use a maximum number of bytes instead of 'On', as
; a value for this directive (e.g., output_buffering=4096).
output_buffering = Off
Y cuando hago un phpinfo() me aparece
output_buffering no value no value

Debería aparecer Off no?

Esto es muy raro, si pongo 4096 y reinicio el apache si que aparece el número, en cambio si pongo Off aparece "no value"

¿Puede haber algo más?
  #12 (permalink)  
Antiguo 14/06/2010, 21:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Pues realmente no se, yo lo probe en mi localhost con el output_buffering en Off y me funciona como debe apareciendo cada X tiempo los mensajes.

SAludos.
  #13 (permalink)  
Antiguo 16/06/2010, 14:38
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Cita:
Iniciado por GatorV Ver Mensaje
Pues realmente no se, yo lo probe en mi localhost con el output_buffering en Off y me funciona como debe apareciendo cada X tiempo los mensajes.

SAludos.
Ni desinstalando el APPSERV e instalando un WAMPSERVER he conseguido que funcione xDDD

Y eso que la variable dichosa output_buffering la tengo en Off empiezo a pensar que hay algo más... he probado en dos navegadores distintos por si fuera de ahi... pero tampoco

  #14 (permalink)  
Antiguo 16/06/2010, 15:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mostrar resultados en cada iteración del bucle y no al final

Revisa que configuraciones también tiene el webserver para enviar el contenido eso puede causar eso como extensiones como gzip y similares.

Saludos.

Etiquetas: bucle, final, resultados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:09.