Foros del Web » Programando para Internet » PHP »

Cómo imprimir valor antes de terminar Script?

Estas en el tema de Cómo imprimir valor antes de terminar Script? en el foro de PHP en Foros del Web. Tengo esto: Código PHP: function  tratar_img (){      proceso ...      proceso ...      proceso ...     FOR( $a = 0 ; $a < 88 ; ...
  #1 (permalink)  
Antiguo 19/02/2005, 08:05
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.942
Antigüedad: 13 años, 9 meses
Puntos: 20
Cómo imprimir valor antes de terminar Script?

Tengo esto:
Código PHP:
function tratar_img(){
    
proceso...
    
proceso...
    
proceso...
    FOR(
$a=0;$a<88;$a++)
    {
    
proceso...
    
proceso...
    
proceso...
    echo 
"Imagen $a procesada<br>";}} 
Y como saben, solo me imprime una lista laaarga al terminar el SCRIPT COMPLETO, y no al final de cada "proceso".

Asi que coloque
Código PHP:
flush();
Tamiben    ob_flush();
Y  ob_end_flush(); 
Y no me imprime nada, o me da error.

Entonces coloque ob_start() al inicio del script + las lineas anteriores, y no paso nada...

Asi que Cómo imprimir valor antes de terminar Script?

Salu2!.
  #2 (permalink)  
Antiguo 19/02/2005, 08:08
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.942
Antigüedad: 13 años, 9 meses
Puntos: 20
mbien utilice

ob_get_contents();
  #3 (permalink)  
Antiguo 07/03/2005, 19:32
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.942
Antigüedad: 13 años, 9 meses
Puntos: 20
Lo que pretendo es que cada parrafo sea impreso ANTES de ternminar de generarse TODA la pagina.

Asi se sabe que "Sí esta procesandose".

Pero lo que hace PHP es enviarme toda la salida de un sopeton:
Código PHP:
<?php
    ob_start
();
    @
set_time_limit(0);
    
$salida='';
    
$a=1;
    
$c=90000;
    while(
$a<999999){
        
$b=$a;
        if(
$b>$c){
        echo 
"<p> $b";
        
$c=$c+$c;
        }
        
$a++;
        
ob_get_contents();
        
ob_flush();
        }
?>
Como puedo imprimir lo que halla en memoria, sin esperar el total del proceso?
  #4 (permalink)  
Antiguo 08/03/2005, 05:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sólo necesistas usar flush() despues de tu echo .. eso fuerza a PHP a que entregue todo lo que tenga en el buffer de salida al cliente. (no hay que usar ob_start() ni otras funciones .. para este caso).

Ahora .. el resultado hacia el cliente .. no esperes que sea inmediato .. pero funciona (yo por lo menos lo he usado así).

Otras cosas que puedan afectar a que no te funcione como esperas .. lo describe la documentación oficial de la función flush() .. ahí veras por ejemplo que IE (navegador) .. sólo empieza a enviar datos cuando recibe almenos 256 bytes (por eso decía que no es inmediato el efecto que esperas). También afecta si usas mod_gzip (si usas compresión en tus páginas si usas Apache como servidor HTTP) ... Habla tambien sobre detalles si usas windows ..

También tienes un ejemplo interesante en los comentarios de los usuarios de dicha función para crear una barra de progreso (usando el control del buffer + javascript) .. pruebalo.

Un saludo,
  #5 (permalink)  
Antiguo 08/03/2005, 13:26
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.942
Antigüedad: 13 años, 9 meses
Puntos: 20
Gracias profe.

Siempre utilizo Mozilla.

Lo que sucede es que he leido:
Código PHP:
ob_flush
 
ob_flush
(PHP 4 >= 4.2.0)

ob_flush --  Vaciar (enviarel búfer de salida 
Descripción
void ob_flush 
void )


Esta función enviará los contenidos del búfer de salida (si los hay). Si desea continuar procesando los contenidos del búfertiene que llamar ob_get_contents() antes de ob_flush(), ya que los contenidos del búfer son descartados luego de que la función ob_flush() es llamada

Esta función no destruye el búfer de salidacomo lo hace ob_end_flush(). 

Vea también ob_get_contents(), ob_clean(), ob_end_flush() y ob_end_clean().] 
Y por eso utilice ob_get_contents antes de.

Acabo de subir el file a LINUX, y ahi sí todo va como una seda!!!!!. GRACIAS!!!.

Que vaina!, es error del WIN...
Tanto time perdido...

Solo hube de editar el script, por que el anterior se le hace muy suava a UNIX:
Código PHP:
<monton de codigo html, (dice el manual en ingles que minimo 256 bytes, (yo puse 5mil))>
<?php
# Para imprimir antes de finalizar proceso:
    
ob_start();
    @
set_time_limit(0);
    
$salida='';
    
$a=1;
    
$b=999999;
    while(
$a<9999999){
        if(
$a>$b){
        echo 
"<p>+ $a ".date('H:i:s');
        
flush();
        
$b=$b+$b;
        }
        
$a++;
                }
ob_end_flush();
exit;
?>
Nota: El anterior script A MI NO me funciona, ni en WIN, ni en NIX, ahora con estas 2 lineas si me funciona:
Código PHP:
<mucho HTML><?php
# Para imprimir antes de finalizar proceso:
    
ob_start();
    @
set_time_limit(0);
    
$salida='';
    
$a=1;
    
$b=999999;
    while(
$a<9999999){
        if(
$a>$b){
        echo 
"<p>+ $a ".date('H:i:s');
        
flush();
        
$b=$b+$b;
        }
        
$a++;
        
ob_get_contents();
        
ob_flush(); 
                }
ob_end_flush();
exit;
?>
No se por que sin ellas no me va... ¿?...
  #6 (permalink)  
Antiguo 08/03/2005, 13:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Yo sinceramente .. he usado flush() sólo (sin más funciones) para lo que pretendes hacer con buenos resultados .. Revisa la configuración de PHP que usas ..hay directivas que definen como PHP gestionará el buffer de salida por defecto .. o si vas a usar compresión (eso sería en la configuración de tu servidor HTTP ..y en php también ..) ..

Un saludo,
  #7 (permalink)  
Antiguo 08/03/2005, 13:40
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.942
Antigüedad: 13 años, 9 meses
Puntos: 20
>>> A mime funciona bien Con o SIN HTML tanto en IE como con los demas browsers.

Solo con estas lineas me funciona bastante bien:
Código PHP:
<?php
# Para imprimir antes de finalizar proceso:
    
ob_start();
    @
set_time_limit(0);
    
$salida='';
    
$a=1;
    
$b=999999;
    while(
$a<9999999){
        if(
$a>$b){
        echo 
"\r\n\t<p>+ $a ".date('H:i:s');
        
flush();
        
$b=$b+$b;
        }
        
$a++;
        
ob_flush();
                }
ob_end_flush();
?>
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 16:02.