Foros del Web » Programando para Internet » PHP »

Como funciona ob flush?

Estas en el tema de Como funciona ob flush? en el foro de PHP en Foros del Web. Es decir, me podrian dar un ejemplo, como para comprenderlo? Segun el website de php, sirve para sacar datos por el buffer de salida, antes ...
  #1 (permalink)  
Antiguo 23/06/2008, 14:36
 
Fecha de Ingreso: mayo-2008
Ubicación: En la guarida del mal, tratando de conquistar el mundo
Mensajes: 174
Antigüedad: 15 años, 10 meses
Puntos: 2
Como funciona ob flush?

Es decir, me podrian dar un ejemplo, como para comprenderlo?

Segun el website de php, sirve para sacar datos por el buffer de salida, antes de que termine de cargar la página...

Es decir...

Se usaria asi...: (?)

ob_flush("Cargando...");

Algo asi? xD?

Porfavor si me explican :)
  #2 (permalink)  
Antiguo 23/06/2008, 14:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Como funciona ob flush?

Hola ZequeZ,

ob_flush se usa en conjunto con ob_start, y es para enviar el contenido al cliente hasta que tu lo requieras por ejemplo:
Código PHP:
echo "Hola!";
ob_start();
echo 
"otra cosa :D";
ob_flush();
ob_start();
echo 
"esto jamas saldra";
ob_end_clean(); 
Saludos.
  #3 (permalink)  
Antiguo 06/10/2010, 08:10
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 5 meses
Puntos: 4
Respuesta: Como funciona ob flush?

Hola se que este es un tema antiguo, pero aparece de los primeros en google ob_flush() pero el ejemplo que dan mas arriba no funciona, por lo menos en la mayoría de los servidores, agrego mas información adicional y otros datos útiles.

Si el ejemplo de arriba no funciona puedes ocupar esto cuando quieres que se envie el texto

flush();
ob_flush();

lo que hacen estas dos funciones es obligar al servidor a que envié la información que esta en el buffer, el buffer es un espacio en la memoria del servidor que se va llenando con la información que se enviara a un cliente o usuario, solo se envia cuando el bufefr se llena (creo que lo general es que sean 4096 b)

En una pagina normal eso esta bien, pero pro ejemplo si tienes un script pesado que procesa fotografias grandes o que crea zip o algo que toma tiempo supongamos algo que toma 5 minutos o una simple tabla con muchos datos que queires que se vaya viendo a medida que se va procesando, bueno como solo se envia la informacion a medida que se lelna el buffer existen ese grupo de funciones que obligan al servidor a ir enviando lo que genera tu archivo php a medida que va avanzando en su ejecución.

En firefox esto siempre funciona bien, pero en IE hay una excepcion, IE tiene un cache interno que una vez que esta cargada la pagina formatea el contenido, uno de los casos comunes son las tablas, aunque ocupes
flush();
ob_flush();
El propio cache de IE solo mostrara la tabla cuando reciba el cierre de la misma, a diferencia de Firefox y los otros que van mostrando sin necesidad de cerrar la tabla, la solucion es no ocupar tablas en esos casos con CSS creo que no hay problema aunque posiblemente algunos codigos tambien podrian presentar ese error. otra singularidad es que aveces primero hay que enviar cierto numero de bytes 256 o 516 dependiendo de la version de IE, todo eso para que lo tomes en cuenta a la hora de corregir bugs.

Tambien ley por ahi aunque no me ha pasado que hay firewalls o antivirus o ciertas versiones de servidores web que tambien limitan la salida del buffer y esto se puede resolver en algunos casos llamando esta funcion

function flush_buffers(){
ob_end_flush();
ob_flush();
flush();
ob_start();
}

Hay otras excepciones cuando trabajas con headers, por que los headers se envian al principio, generalmente antes que se ejecute el script, de todas maneras hay formas para corregir esos problemas aunque quizas alguno de esos problemas se corrigen modificando en php.ini y aveces no se puede hacer eso si usamos un hosting, especulo pro que no recuerdo cuando me paso ni con que software o web, si me acuerdo de un error que nos tomo tiempo de reparar y era un espacio antes de <?PHP o un un espacio al final del ?> aveces eso es mejor revisarlo con un editor hexadecimal, pero bueno eso ya es otro tema


Dejo dos ejemplos adicionales

Código PHP:
<?php
//la version que yo ocupo
//ob_start(); // yo ponia ob_start() al principio del script pero despues me di cuenta 
//que no era necesaria, creo que depende del servior web, pero en php.net esta bien explicado
echo "Ejemplo 2 :)</br>";
flush();
ob_flush();
Sleep(2);
echo 
"Ya pasaron dos 2 segundos</br>";
flush();
ob_flush();
Sleep(2);
echo 
"y otros dos mas... 4</br>";
flush();
ob_flush();
Sleep(2);
echo 
"y otros dos mas... 6</br>";
?>


Código PHP:
<?php
//version si todo lo demas falla
function flush_buffers(){
    
ob_end_flush();
    
ob_flush();
    
flush();
    
ob_start();


echo 
"Ejemplo 3 - :)</br>";
flush_buffers();
Sleep(2);
echo 
"Ya pasaron 2 segundos</br>";
flush_buffers();
Sleep(2);
echo 
"Y dos mas... 4 segundos</br>";
flush_buffers();
Sleep(2);
echo 
"OK eso seria todo... 6 segundos así ves que funciona y que no</br>";
?>
__________________
Ayuda!! firmar y compartir
No a la privatizacion de semillas http://www.thepetitionsite.com/1/no-...n-de-semillas/
Mas info: http://chilesintransgenicos.cl/
  #4 (permalink)  
Antiguo 06/10/2010, 08:18
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Como funciona ob flush?

Muy bueno lo que indicaste, pero para que el ejemplo segundo funcione, necesitas primero iniciar ob_start y no en todos los navegadores funciona lo de la función flush_buffers, por eso es importante ingresar la cantidad de caracteres necesarios para que así los navegadores envien la información.
Código PHP:
Ver original
  1. <?php
  2. //version si todo lo demas falla
  3. function flush_buffers(){
  4.     echo str_pad('',4096);
  5.     ob_end_flush();
  6.     ob_flush();
  7.     flush();
  8.     ob_start();
  9. }  
  10. echo "Ejemplo 3 - :)</br>";
  11. flush_buffers();
  12. Sleep(2);
  13. echo "Ya pasaron 2 segundos</br>";
  14. flush_buffers();
  15. Sleep(2);
  16. echo "Y dos mas... 4 segundos</br>";
  17. flush_buffers();
  18. Sleep(2);
  19. echo "OK eso seria todo... 6 segundos así ves que funciona y que no</br>";
En este tema http://www.forosdelweb.com/f18/sleep...amente-825869/ también se toca base a lo que se menciona aquí.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 06/10/2010, 08:52
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 5 meses
Puntos: 4
Respuesta: Como funciona ob flush?

Lo del ejemplo 2 si funciona en la practica, es un script que ocupo hace tiempo 4 anios aprox (PHP4 y 5), actualiza unos 40000 xml y hace tiempo que borre el ob_start(); algun problema producia aveces como el script es largo, aunque lo tengo paginado en unos 150 o 200 flush por cierta cantidad de xml.

Se que php.net recomienda ocupar el ob_start(); pero no me ha dado problemas desde que lo quite.

lo de los 4096 espacios en blanco se suponía que era solo al principio o cada vez que se hacia el flush?, bueno voy a leer el post que mencionas :)

gracias por tu comentario

Saludos
__________________
Ayuda!! firmar y compartir
No a la privatizacion de semillas http://www.thepetitionsite.com/1/no-...n-de-semillas/
Mas info: http://chilesintransgenicos.cl/
  #6 (permalink)  
Antiguo 06/10/2010, 09:41
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Como funciona ob flush?

Si no comienzas el ob_start te traerá una notificación. Algo como
Notice: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush. in ....

Claro está eso sale cuando colocas en el php.ini en el error_reporting para que también te muestre las notificaciones.

Lo de añadir 4096 bytes, es verdad que con tan solo añadir al principio funciona.
Código PHP:
Ver original
  1. <?php
  2. echo str_pad('',4096);
  3. function flush_buffers(){
  4.     ob_end_flush();
  5.     ob_flush();
  6.     flush();
  7.     ob_start();
  8. }  
  9. echo "Ejemplo 3 - :)</br>";
  10. flush_buffers();
  11. Sleep(2);
  12. echo "Ya pasaron 2 segundos</br>";
  13. flush_buffers();
  14. Sleep(2);
  15. echo "Y dos mas... 4 segundos</br>";
  16. flush_buffers();
  17. Sleep(2);
  18. echo "OK eso seria todo... 6 segundos así ves que funciona y que no</br>";
Aunque prefiero asegurarme...
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 06/10/2010, 17:26
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 5 meses
Puntos: 4
Respuesta: Como funciona ob flush?

Si, en realidad nunca uso las notificaciones de php ^_^

Bueno probé con notificaciones, adicionalmente uso esto para mostrar errores en entorno de producción posiblemente tiene mas de lo que necesita :P

Código PHP:
function reportAllErrors()
{
    
// quitarle el '^ E_NOTICE' para que muestre las notificaciones
    
ini_set ('error_reporting'E_ALL E_NOTICE); 
    
ini_set ('display_errors'TRUE);
    
ini_set ('display_startup_errors'TRUE);
    
ini_set ('log_errors'TRUE);
    
ini_set ('track_errors'TRUE);
    
ini_set ('html_errors'TRUE);

revise y el ejemplo 2 y el 3 los dos tienen NOTICE

Código:
Ejemplo 3 - :)

Notice: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush. in...
el ob_start() produce que el primer mensaje se muestre a los 2 o 4 segundos en vez de inmediatamente, y los dos últimos se muestran juntos, sin embargo si no se incluye en ob_start apesar de los NOTICE funciona como deberia... voy a revisar mas eso voy a incluir lo de los 4096 caracteres para que funcione en todo tipo de casos.

De todas maneras entendí algo, por un lado están las salidas de texto que generan el codigo, luego una capa intermedia que es el buffer y al final lo que llega al browser por eso flush y ob_flush deben ser utilizados junto, uno envia la info del codigo al buffer y el otro del buffer al browser, creo es bastante extranio, ademas para ser una cosa que parece simple tiene 17 funciones?? voy a leer mas pero ya se me acabo el tiempo para seguir investigando mas...
http://www.php.net/manual/en/book.outcontrol.php

tiene que haber una solución limpia que sirva en todos los casos y sin errores
__________________
Ayuda!! firmar y compartir
No a la privatizacion de semillas http://www.thepetitionsite.com/1/no-...n-de-semillas/
Mas info: http://chilesintransgenicos.cl/
  #8 (permalink)  
Antiguo 06/10/2010, 17:35
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Como funciona ob flush?

Si añades los 4096 antes de todo código, te sale inmediato.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 06/10/2010, 18:03
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Como funciona ob flush?

lee esto
veras, que el contenido de la función se puede reducir.
saludos.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
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 05:04.