Foros del Web » Programando para Internet » PHP »

Búfer de salida

Estas en el tema de Búfer de salida en el foro de PHP en Foros del Web. Hola que tal bue día, Este tema suele ser te programación en general pero lo coloqué en tema de PHP porque deseo respuestas específicas de ...
  #1 (permalink)  
Antiguo 18/09/2011, 23:21
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Búfer de salida

Hola que tal bue día,

Este tema suele ser te programación en general pero lo coloqué en tema de PHP porque deseo respuestas específicas de PHP.

El problema es que no he entendido muy bien que datos son los que se almacenan en búfer de salida.

Hé leído varios artículos sobre éste tema, incluído algunos ejemplos de PHP usando flush() para vaciar el bufer de salida, pero no logró captar con claridad que datos son los que se están limpiando.

Pero... ¿Qué datos son los que se almacenan y limpian en el bufer de salida de PHP?
¿Serán los strings?, ¿las funciones?, ¿los recursos como el de una imagen?...

Por favor necesito algo muy específico hablando de PHP, muchas gracias y saludos.
  #2 (permalink)  
Antiguo 19/09/2011, 00:16
Avatar de fjflores  
Fecha de Ingreso: agosto-2011
Ubicación: Cádiz
Mensajes: 27
Antigüedad: 12 años, 8 meses
Puntos: 8
Respuesta: Búfer de salida

Mírate esta respuesta:
http://www.forosdelweb.com/f18/para-que-utilizar-ob_start-manual-esta-ingles-226459/
Aquí te explica por encima cómo funciona el sistema de bufer's.
Un saludo.
  #3 (permalink)  
Antiguo 19/09/2011, 01:11
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Búfer de salida

Bueno, a manera de resumen:

Es posible que tanto el servidor como el navegador hagan complot (generalmente porque la informacion viaja comprimida) para evitar que la salida enviada por PHP aparezca en pantalla hasta que se cumplan ciertos requisitos, como que se reciba cierta cantidad de caracteres o se envie una instruccion especifica (como flush()) o algun otro evento.

Entonces, la informacion viaja en paquetes y mientras estos no esten completos, no se mostraran en pantalla. Logicamente dependera de la configuracion tanto de servidor como del navegador.

La opcion que menciona fjflores con ob_start() y funciones relacionadas, sirve para que PHP guarde toda la salida en un buffer especifico que te permitira almacenarlo en una variable con ob_get_contents(), enviarlo hasta que tu lo quieras con ob_end_flush() y/o cancelar todo el envio con ob_end_clean().

Como ves, flush() y ob_XXXX() tienen diferente uso, generalmente esta ultima es "mal usada" para evitar mensajes de error referentes a encabezados por activar sesiones, redirigir a otra pagina, crear cookies, etc.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 19/09/2011, 10:27
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Búfer de salida

Hola que tal, gracias por sus respuestas ya había leído en la documentación de PHP, pero me ya logré entender mejor investigando un poco más y con sus respuesta.

Ahora el problema es el siguiente:
Cita:
¿Para qué limpiar el bufer de salida con flush() , si nisiquiera hay datos en el búfer de salida?, y lo peor de todo... ¿Por qué deja de funcionar tal script si no se aplica esta técnica tan ilógica?.
Me resulta ilógico porque, según yo, para que se retengan los datos en el búfer de salida, se necesita utilizar ob_start(), pero si no lo estoy utilizando... ¿Por qué es necesario limpiar el búfer de salida?

Un script que me exige utilizar flush() e incluso imprimir algún dato antes de flush, es el siguiente:

Funciona
Código PHP:
Ver original
  1.  
  2.     echo "lalalalala";//requerido para que funciona flush()
  3.     flush();
  4. }
  5.  
  6. $f=fopen("Abortado","w");//Se crea un archivo para saber si el usuario abandonó
  7. fclose($f);

NO funciona:
Código PHP:
Ver original
  1.  
  2.  
  3. $f=fopen("aborted.txt","w");    //No se creará el archivo solo por no usar flush() -.-!
  4. fclose($f);

Que rayos hace flush() para que el script funcióne!!! si nisiqueira no hay nada que limpiar en el búfer de salida.....

¿¿¿¿¿Why?????, gracias y saludos!
  #5 (permalink)  
Antiguo 19/09/2011, 10:32
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: Búfer de salida

Cada echo, envia datos al buffer de salida, es por eso que esta flush() ya que echo envia los datos al browser de salida y este forza el envio.

Saludos.
  #6 (permalink)  
Antiguo 19/09/2011, 13:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Búfer de salida

Cita:
Iniciado por IXtremeLT
Me resulta ilógico porque, según yo, para que se retengan los datos en el búfer de salida, se necesita utilizar ob_start(), pero si no lo estoy utilizando... ¿Por qué es necesario limpiar el búfer de salida?
Parece que no entendiste del todo, necesitas leer el manual de PHP para flush():

Cita:
Vacía los búferes de salida de PHP y de cualquiera que sea el motor que PHP esté usando (CGI, un servidor web, etc). Esto en efecto trata de enviar toda la salida acumulada hasta el momento al navegador del usuario.

flush() quizá no puede sobreescribir el esquema del búfer en su servidor web y no tiene efectos sobre el método de uso de búferes de su servidor web o del navegador en el lado del cliente. Por lo tanto es necesario llamar tanto a ob_flush() como a flush() para volcar los búferes de salida.

Varios servidores, especialmente en Win32, seguirán almacenando la salida de su script en búferes hasta que éste termine antes de transmitir los resultados al navegador.

Puede que algunos módulos de servidor para Apache como mod_gzip usen búferes propios que causarán que flush() no resulte en un envío inmediato de datos al cliente.

Incluso el navegador puede usar búferes de entrada antes de mostrar el resultado. Netscape, por ejemplo, almacena en búfer el texto hasta que recibe un final-de-línea o el comienzo de una etiqueta, y no renderiza las tablas hasta que la etiqueta </table> de la tabla más externa sea encontrada.

Algunas versiones de Microsoft Internet Explorer solo empezarán a mostrar la página después de que han recibido 256 bytes de salida, así que puede que sea necesario enviar espacios en blanco extra antes del volcado para lograr que se muestre la página en esos navegadores.

http://php.net/manual/es/function.flush.php
Resumen:
flush() tratara de forzar al navegador a vaciar todos los buferes de salida, PHP, Servidor web, compresion y navegador.
ob_flush() y similares se limitan solo a los buferes de PHP.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 20/09/2011, 01:45
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Búfer de salida

Gracias pero esa información ya la he leído varias veces y aún no logro entender el porque el uso de flush() al usar la funcion connection_aborted()???, saludos.
  #8 (permalink)  
Antiguo 20/09/2011, 02:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Búfer de salida

Bueno, cuando algo no se entiende, hay que recurrir al manual y leer los comentarios, muchas veces explican situaciones no consideradas en el mismo manual.

Cita:
Comentario en el manual de connection_aborted()

In order to detect a disconnection inside the script we need to flush the buffer (it is only when the the server tries to send the buffer content that it will see that the connection is broken).
Traduccion no literal (por si las moscas):

Para poder detectar la desconexion en el script es necesario vaciar el bufer, solo cuando el servidor trata de enviar el contenido del bufer es cuando se puede detectar si la conexion finalizo.

Mas claro todavia?, si PHP no esta enviando contenido al navegador directamente (sin bufer), no hay manera de que se entere si la conexion sigue activa o no.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 20/09/2011, 16:17
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Búfer de salida

Gracias creo ya haber entendido el problema, saludos!
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 04:26.