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('' '', 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 aob_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>
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 />'';