strip_tags remove inicio fin etiquetas ejemplo php apache echo flush

php - remove - Cómo descargar la salida después de cada llamada `echo`?



strip_tags wordpress (16)

Tengo un script php que solo produce registros para el cliente.
Cuando hago eco de algo, quiero que se transfiera al cliente sobre la marcha.
(Porque mientras el script está procesando, la página está en blanco)
Ya había jugado con ob_start() y ob_flush() , pero no funcionaron.

¿Cuál es la mejor solución?

PD: está un poco sucio poner color al final de la llamada de echo ...

EDITAR: ¿Ni las respuestas funcionó, PHP o Apache Fault?


A veces, el problema proviene de la configuración de Apache. Apache se puede configurar para descomprimir la salida. En el archivo .htaccess puede agregar, por ejemplo:

SetEnv no-gzip 1


Así que esto es lo que descubrí.

Flush no funcionaría bajo mod_gzip de Apache o gzip de Nginx porque, lógicamente, está comprimiendo gzip el contenido, y para hacerlo debe almacenar el contenido para gzip. Cualquier tipo de servidor web gzipping afectaría esto. En resumen, en el lado del servidor necesitamos desactivar gzip y disminuir el tamaño del búfer de fastcgi. Asi que:

  • En php.ini:

    output_buffering = Off zlib.output_compression = Off

  • En nginx.conf:

    gzip off; proxy_buffering off;

Tenga también estas líneas a mano, especialmente si no tiene acceso a php.ini:

@ini_set(''zlib.output_compression'',0); @ini_set(''implicit_flush'',1); @ob_end_clean(); set_time_limit(0);

Por último, si lo tiene, comente el siguiente código:

ob_start(''ob_gzhandler''); ob_flush();

Código de prueba de PHP:

ob_implicit_flush(1); for ($i=0; $i<10; $i++) { echo $i; // this is to make the buffer achieve the minimum size in order to flush data echo str_repeat('' '',1024*64); sleep(1); }


El software antivirus también puede interferir con el flujo de salida. En mi caso, Kaspersky Anti-Virus 2013 tenía fragmentos de datos antes de enviarlos al navegador, aunque estaba usando una solución aceptada.


Este es mi código: (trabajo para PHP7)

private function closeConnection() { @apache_setenv(''no-gzip'', 1); @ini_set(''zlib.output_compression'', 0); @ini_set(''implicit_flush'', 1); ignore_user_abort(true); set_time_limit(0); ob_start(); // do initial processing here echo json_encode([''ans'' => true]); header(''Connection: close''); header(''Content-Length: '' . ob_get_length()); ob_end_flush(); ob_flush(); flush(); }


Esto funciona bien para mí (Apache 2.4 / PHP 7.0):

@ob_end_clean(); echo "lorem ipsum..."; flush(); sleep(5); echo "<br>dolor..."; flush(); sleep(5); echo "<br>sit amet";


La función correcta para usar es flush() .

<html> <body> <p> Hello! I am waiting for the next message...<br /> <?php flush(); sleep(5); ?> I am the next message!<br /> <?php flush(); sleep(5); ?> And I am the last message. Good bye. </p> </body> </html>

Tenga en cuenta que hay un "problema" con IE, que solo emite el contenido descargado cuando tiene al menos 256 bytes, por lo que su primera parte de la página debe tener al menos 256 bytes.


Llegué tarde a la discusión, pero leí que muchas personas dicen agregar Flush (); al final de cada código se ve sucio, y tienen razón.

La mejor solución es desactivar desinflar, gzip y todo el almacenamiento en búfer de Apache, controladores intermedios y PHP. Luego en tu php.ini deberías tener:

output_buffering = Off zlib.output_compression = Off implicit_flush = Off

La solución temporal es tener esto en su php.ini SI puede resolver su problema con flush (); pero crees que es sucio y feo ponerlo en todas partes.

implicit_flush = On

Si solo lo colocas arriba en tu php.ini, no necesitas poner flush (); en tu código más.


Obtuve el mismo problema y uno de los ejemplos publicados en el manual funcionó. Un juego de caracteres se debe especificar como uno de los carteles que ya se mencionan. http://www.php.net/manual/en/function.ob-flush.php#109314

header( ''Content-type: text/html; charset=utf-8'' ); echo ''Begin ...<br />''; for( $i = 0 ; $i < 10 ; $i++ ) { echo $i . ''<br />''; flush(); ob_flush(); sleep(1); } echo ''End ...<br />'';


Para aquellos que vienen en 2018:

La ÚNICA solución funcionó para mí:

<?php if (ob_get_level() == 0) ob_start(); for ($i = 0; $i<10; $i++){ echo "<br> Line to show."; echo str_pad('''',4096)."/n"; ob_flush(); flush(); sleep(2); } echo "Done."; ob_end_flush(); ?>

y es muy importante mantener parte de "4096" porque parece que "llena" el buffer ...


Por qué no hacer una función para hacer eco, así:

function fecho($string) { echo $string; ob_flush(); }


Prueba esto:

while (@ob_end_flush()); ob_implicit_flush(true); echo "first line visible to the browser"; echo "<br />"; sleep(5); echo "second line visible to the browser after 5 secs";

Solo fíjate que de esta manera estás deshabilitando el búfer de salida para tu script actual. Supongo que puedes volver a habilitarlo con ob_start () (no estoy seguro).

Lo importante es que al deshabilitar el búfer de salida como se indica arriba, ya no podrá redirigir su script php utilizando la función header() , ya que php solo se puede enviar una vez por cada ejecución de script encabezados http. Sin embargo, puedes redirigir usando javascript. Simplemente deja que tu script php haga eco de las siguientes líneas cuando se trata de eso:

echo ''<script type="text/javascript">''; echo ''window.location.href="''.$url.''";''; echo ''</script>''; echo ''<noscript>''; echo ''<meta http-equiv="refresh" content="0;url=''.$url.''" />''; echo ''</noscript>''; exit;


Tenía algo similar que hacer. Utilizando

// ini_set("output_buffering", 0); // off ini_set("zlib.output_compression", 0); // off ini_set("implicit_flush", 1); // on

hizo que el flujo de salida fuera frecuente en mi caso.

Pero tuve que descargar la salida en un punto particular (en un bucle que corrí), así que usar ambos

ob_flush(); flush();

juntos trabajaron para mí.

No pude desactivar "output_buffering" con ini_set (...), tuve que convertirlo directamente en php.ini, phpinfo () muestra su configuración como "sin valor" cuando está apagado, ¿es eso normal? .


Tenga en cuenta que si se encuentra en ciertos sitios de alojamiento compartido como Dreamhost, no puede deshabilitar el búfer de salida de PHP sin pasar por diferentes rutas:

Cambio del caché del buffer de salida Si está utilizando PHP FastCGI, las funciones de PHP flush (), ob_flush () y ob_implicit_flush () no funcionarán como se esperaba. Por defecto, la salida está almacenada en un nivel superior a PHP (específicamente, por el módulo Apache mod_deflate que es similar en forma / función a mod_gzip).

Si necesita resultados sin búfer, debe usar CGI (en lugar de FastCGI) o contactar a soporte para solicitar que mod_deflate esté deshabilitado para su sitio.

https://help.dreamhost.com/hc/en-us/articles/214202188-PHP-overview


Vaciar aparentemente fallar en el trabajo es un efecto secundario de la detección automática del juego de caracteres.

El navegador no mostrará nada hasta que no conozca el juego de caracteres para mostrarlo, y si no especifica el juego de caracteres, necesita intentar adivinarlo. El problema es que no se puede adivinar correctamente sin suficientes datos, por lo que los navegadores parecen tener este búfer de 1024 bytes (o similar) que necesitan rellenar antes de mostrar nada.

La solución es, por lo tanto, asegurarse de que el navegador no tenga que adivinar el juego de caracteres.

Si está enviando texto, agregue un ''; charset = utf-8 ''a su tipo de contenido, y si es HTML, agregue el conjunto de caracteres a la metaetiqueta adecuada.


lo que quieres es el método de flush . ejemplo:

echo "log to client"; flush();


Editar:

Estaba leyendo los comentarios en la página del manual y me encontré con un error que dice que ob_implicit_flush no funciona y la siguiente es una solución para ello:

ob_end_flush(); # CODE THAT NEEDS IMMEDIATE FLUSHING ob_start();

Lo que incluso puede estar sucediendo es que el cliente no recibe el paquete del servidor hasta que el servidor haya acumulado suficientes caracteres para enviar lo que considera un paquete que vale la pena enviar.

Vieja respuesta:

Podría usar ob_implicit_flush que indicará a la salida de almacenamiento en memoria intermedia que apague el almacenamiento en búfer por un tiempo:

ob_implicit_flush(true); # CODE THAT NEEDS IMMEDIATE FLUSHING ob_implicit_flush(false);