2012-08-05 9 views
8

Estoy tratando de familiarizarme con la función flush() de PHP para un proyecto que estoy haciendo, escribí algunas secuencias de comandos y las cargué en algún espacio web que poseo; pero parecía que ninguno de ellos funcionó. Cogí la que está debajo de un comentario en PHP.net y probé:PHP flush() aparentemente funciona en mi máquina Linux pero no en mi máquina de Windows?

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

echo 'Begin ...<br />'; 
for($i = 0 ; $i < 10 ; $i++) 
{ 
    echo $i . '<br />'; 
    flush(); 
    sleep(1); 
} 
echo 'End ...<br />'; 

Al parecer el guión aún no estaba funcionando.

luego leí un comentario que dice:

Si llama ob_flush() y flush() y todavía no consigue el buffer tiró de la cadena puede ser debido a algún tipo de software antivirus (Panda en este caso) tiene el búfer hasta que la página haya terminado de cargarse antes de enviarla al navegador.

Así que decidí solicitar la página web en una máquina que tengo usando Linux (Ubuntu 12.04) ya que no tiene ningún software antivirus instalado; y funcionó perfectamente!

No tengo idea si esto tiene que ver con el software antivirus? O algún otro mecanismo extraño en Windows que impida que flush() logre su propósito previsto, estoy usando el mismo navegador en ambas máquinas (Firefox 14.0.1) así que dudo que pueda ser eso.

Así que supongo que mi verdadera pregunta es: ¿Alguien sabe algo sobre el software antivirus que impide que flush() logre su propósito (porque parece que no puedo encontrar nada al respecto en línea)? Y si es así, ¿hay alguna forma de evitarlo?

EDIT: para aclarar, estoy seguro de que esto NO es del lado del servidor, tengo un servidor web externo que ejecuta Linux, no estoy alojando estos scripts localmente en Linux o Windows Machine.

EDIT2: Probé esto en una casa de amigos en la computadora portátil Linux que logré que funcionara en mi casa, curiosamente el código de descarga tampoco funcionaba en su casa (en cambio, tardó años en cargarse y todos salieron a la vez) lo cual es extraño ya que funciona en esta computadora portátil en mi casa, no estoy seguro de si los enrutadores tienen algo que ver con la función flush() funcionando (realmente no puedo encontrar nada sobre esto en la web) porque eso es lo único que se me ocurre que podría interferir con eso.

De lo contrario, no he progresado tratando de solucionar esto por mi cuenta, definitivamente esto no tiene que ver con el servidor, lo cual es extraño ya que la mayoría de la información que parece estar hablando del servidor es el problema cuando la función flush() no funciona:/

Casualmente, también probé esto en una PC que ejecuta Norton (en lugar de AVG) en mi casa, funcionó pero no del 100%.

Respuesta

4

Hay varias cosas que pueden prevenir la salida se muestren inmediatamente, incluyendo:

  • Buffering desde dentro de PHP (que es lo flush previene)
  • Buffering con el fin de acumular suficientes datos para comprimir (cuando compresión está habilitada)
  • Buffering en el servidor web (puede decidir hacerlo por cualquier razón)
  • Buffering dentro del navegador (los navegadores usan varias técnicas para que la carga de la página "se sienta rápido" hasta el final usuario; estas técnicas no siempre incluyen la visualización de contenido tan pronto como esté disponible)

Desde flush no puede controlar todo en esta lista, en realidad no hay garantía de que el programa se comportará como se espera que lo haga.

Todo esto se menciona en las notas de flush:

Vacía los buffers de escritura de PHP y cualquiera que sea el motor que PHP está usando (CGI, el servidor web, etc). Esto intenta enviar la salida actual al forma del navegador con algunas advertencias.

flush() puede no ser capaz de anular el esquema de almacenamiento en búfer de su servidor web y no tiene ningún efecto sobre el almacenamiento en memoria del lado del cliente en el navegador . Tampoco afecta el mecanismo de memoria de salida del espacio de usuario de PHP mecanismo. Esto significa que tendrá que llamar tanto a ob_flush() como a flush() para enjuagar los buffers de salida ob si los está utilizando.

Varios servidores, especialmente en Win32, aún almacenarán en búfer la salida de su script hasta que termine antes de transmitir los resultados al navegador.

Los módulos de servidor para Apache como mod_gzip pueden hacer un almacenamiento en memoria propia que hará que flush() no provoque que los datos se envíen inmediatamente al cliente.

Incluso el navegador puede almacenar su entrada antes de mostrarla. Netscape, por ejemplo, almacena temporalmente el texto hasta que recibe un final de línea o el comienzo de una etiqueta, y no procesará las tablas hasta que se vea la etiqueta de la tabla más externa.

Algunas versiones de Microsoft Internet Explorer sólo empezarán a mostrar la página después de haber recibido 256 bytes de salida, por lo que pueden necesitar para enviar espacios en blanco extra antes de lavar para conseguir esos navegadores para mostrar la página.

+0

Sé que esto es definitivamente del lado del cliente y no del lado del servidor, la misma página funcionó perfectamente cuando se procesó en Firefox en Linux, pero no en Windows. Lo que me llevó a pensar que esto tampoco es un problema relacionado con el navegador. . . eso parece eliminar todas las explicaciones en esa cita:/ – Sean

+0

@SeanDunwoody: ¿Cómo sabes que no es del lado del servidor? El servidor es un programa diferente en cada sistema operativo. Lo mismo vale para el navegador también. – Jon

+0

No, lo siento, creo que malinterpreta, tengo un servidor que aloja este Linux en ejecución, no estoy alojando esto localmente en ninguna máquina – Sean

Cuestiones relacionadas