2011-04-24 12 views
18

Hola favor abajo Código:ob_flush() y flush(), sin embargo, el navegador no muestra ninguna salida hasta que termina la escritura

<?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"; 
?> 

Se incorrecta? Lo he probado, pero mi resultado se muestra cuando el script está listo, ¿tiene alguna solución?

+0

¿Ha probado esto en varios navegadores? Quitar 'ob_start()' podría ser una pieza del rompecabezas, pero también podría necesitar hacer algo similar a lo que Jürgen sugirió si aún no funciona en IE. –

+0

Probado en FireFox 4, IE9, IE8, IE8, IE6, Chrome. todo el tema no funciona –

+0

Hm, solo una suposición descabellada, pero ¿tienes mod_gzip activo para el tipo de mime de tu script? –

Respuesta

3

Intente eliminar la llamada al ob_start() en su primera línea: no es necesario que active el almacenamiento en búfer de salida, y probablemente cause problemas aquí.


He probado el código:

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

Si elimina 'ob_start()', entonces debe eliminar todas las llamadas 'ob_' también. –

+0

No estoy seguro de eso * (Si elimino la llamada a' ob_flush() ', I solo ver la salida después de la demora de 10 segundos) *; quizás sea porque 'output_buffering' está habilitado en mi php.ini, aunque ;;; vea lo que está escrito en http://fr.php.net/flush también –

+0

¿Estás seguro? ? probado en el navegador? –

0

Es correcto. Funciona bien para mí desde CLI con PHP 5.3.3. Si no funciona para usted, su instalación de PHP puede tener el búfer de salida desactivado.

También le sugiero poner ob_end_flush() al final de la secuencia de comandos para cerrar el búfer de salida.

+0

En la interfaz de línea de comandos funciona, pero el navegador ...! y el búfer de salida está habilitado en mi servidor :( –

+0

tengo ob_end_flush() en su lugar – rinchik

4

Algunos navegadores necesitan recibir al menos 256 caracteres antes de comenzar a procesar. Tiene ya ha probado a meter más una salida como:

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

EDITAR:

Bajo Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 que era capaz de reproducir el problema de la OP mediante el establecimiento de

zlib.output_compression = On 

Si se gira de nuevo por

zlib.output_compression = Off 

hizo que el script funcionara como quería.

+1

Gracias pero todavía no funciona :( –

1

En mi sistema parece que FF4 necesita más de 256 bytes para iniciar la prestación de lo que se llega desde el lado del servidor, entonces resolví con esto al principio:

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

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

echo str_repeat(' ', 4096); 

Además, la adición de algún elemento HTML al principio también parecía ser obligatorios:

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

Probablemente el mejor ejemplo esté aquí: http://php.net/manual/en/function.flush .php # 54841 – TomaszKane

15

Hey man También me quedé atrapado en este problema y finalmente tiene la solución correcta aquí está para usted

hay que añadir el tipo de contenido para su página puede hacerlo de dos maneras 1.utilizando la etiqueta html

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

Ej.

<!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. utilizando la función de cabecera 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

+0

No puedo creer que esto realmente funcionó para mi script ... Wow! – rckehoe

+0

Parece que el navegador obtiene el contenido con o sin la línea de tipo de contenido, sin embargo, si no lo tienes, el navegador simplemente cambia el cargar el indicador a "recibir datos" sin mostrar nada. Una vez que envíe el tipo de contenido primero, enviando cualquier cantidad de datos y descarga funcionará =))) Confirmé que existe el mismo comportamiento cuando se ejecuta en Apache e IIS (independientemente de la configuración del búfer de salida)) así que definitivamente se debe a los requisitos propios del navegador. – Yavor

0

Una cuestión astuto con IE8 y flush(); es eso si estás "vaciando" filas en una mesa. IE solo mostrará tablas cuando estén completas. Este era mi problema, y ​​cambiar los contenedores de las filas de la tabla a divs resolvió el problema.

1

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

Para activar gzip fuera de la secuencia de comandos 'lavado' sólo, he creado un nuevo archivo .htaccess en el directorio donde reside el script de salida continua, con lo siguiente:

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

Flushing está funcionando como se espera de nuevo.

1

Para personas que usan FCGI/cgi rápido.

FcgidOutputBufferSize 0 
0

es necesario agregar un archivo .htaccess desactivar la salida gzip

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

estoy usando marco laravel y el almacenamiento en búfer no funcionaba, 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 first ob_end_flush();

0

Este flujo trabaja con laravel demasiado

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"; 
Cuestiones relacionadas