vaciar ob_flush ob_end_flush ob_end failed content php output-buffering

php - ob_end_flush - Llamando a ob_flush() y flush(), sin embargo, el navegador no muestra ningún resultado hasta que finaliza el script



php ob_flush(); (12)

Hola, por favor ver código debajo:

<?php ob_start(); echo "Start ...<br />/n"; for( $i = 0 ; $i < 10 ; $i++ ) { echo "$i<br />/n"; ob_flush(); flush(); sleep(1); } echo "End ...<br />/n"; ?>

Es incorrecto? Lo he probado, pero mi salida muestra cuando el script está hecho, ¿tengo alguna solución?


Algunos navegadores necesitan recibir al menos 256 caracteres antes de comenzar a renderizarse. ¿Ya has intentado rellenar más resultados como:

echo str_repeat(''&nbsp;'', 50) . "$i<br />/n";

EDITAR :

En Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 pude reproducir el problema del OP al configurar

zlib.output_compression = On

Apagándolo de nuevo por

zlib.output_compression = Off

Hizo que el guión funcionara como se quería.


Descubrí que esto se debía a que la compresión gzip de Apache estaba en uso para mi caso.

Para desactivar gzip solo para la secuencia de comandos ''flushing'', creé un nuevo archivo .htaccess en el directorio donde reside la secuencia de comandos de salida continua, con lo siguiente:

<IfModule mod_env.c> SetEnv no-gzip 1 </IfModule>

Flushing está funcionando como se espera otra vez.


En mi sistema, parece que FF4 necesita más de 256 bytes para comenzar a renderizar lo que llega desde el servidor, luego resolví esto al principio:

while (@ob_end_flush()); echo(str_repeat('' '',1024)); // ...etc...


Es correcto. Funciona bien para mí desde CLI ejecutando PHP 5.3.3. Si no funciona, la instalación de PHP puede tener el búfer de salida deshabilitado.

También sugeriría poner ob_end_flush() al final de su script para cerrar el búfer de salida.


Es necesario agregar un archivo .htaccess para deshabilitar la salida de gzip

<IfModule mod_env.c> SetEnv no-gzip 1 </IfModule>


Este flujo también funciona con Laravel.

ob_implicit_flush(true); echo "Processing ... "; // Or give out JSON output ob_flush(); sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?) echo "Done";


Estoy utilizando laravel framework y el almacenamiento en búfer no funcionó pero. Esta es la solución:

header( ''Content-type: text/html; charset=utf-8'' ); ob_start(); ob_end_flush(); ob_flush(); flush(); for($i = 1;$i<= 5;$i++){ echo $i; ob_flush(); flush(); sleep(3); }

Tienes que usar primero ob_end_flush ();


Intente eliminar la llamada a ob_start() en su primera línea: no es necesario que habilite el búfer de salida, y es probable que esto cause problemas, aquí.


He probado tu código:

  • Si se llama a ob_start() en la primera línea, solo veo la salida cuando finaliza el script, después de 10 segundos
  • Si ob_start() esa llamada a ob_start() , veo una línea de salida cada segundo, tan pronto como se muestra en la salida estándar.

Oye, yo también me quedé atascado en este problema y finalmente obtuve la solución correcta aquí es para ti

tiene que agregar el tipo de contenido para su página, puede hacerlo de dos maneras 1. usando la etiqueta html

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Ex.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Wp Migration</title> </head> <body> <?php for($i=0;$i<70;$i++) { echo ''printing...<br>''; ob_flush(); flush(); sleep(3); } ?> </body> </html>

  1. usando la función de encabezado php

    <?php header( ''Content-type: text/html; charset=utf-8'' ); ?>

Ex.

<?php header( ''Content-type: text/html; charset=utf-8'' ); for($i=0;$i<70;$i++) { echo ''printing...<br>''; ob_flush(); flush(); sleep(3); } ?>

Todo lo mejor


Para personas que usan FCGI / fast cgi.

FcgidOutputBufferSize 0


Un problema con IE8 y flush (); es que si estás "vaciando" las filas en una tabla. IE solo mostrará las tablas cuando estén completas. Este fue mi problema, y ​​cambiar los contenedores de las filas de la tabla a divs solucionó el problema.


Usando Chrome, descubrí que se requieren muchos más bytes para evitar el búfer del navegador. En mi caso 4096 bytes estaba bien:

echo str_repeat('' '', 4096);

Además, agregar algún elemento HTML al principio también parecía ser obligatorio:

echo $content . ''<br />'';