2011-09-05 10 views

Respuesta

3

En última instancia, depende. La mayoría de los mecanismos de alojamiento de PHP que he utilizado transmitirán la respuesta en fragmentos, ya que se recibe de la secuencia de comandos, omitiendo por completo el encabezado Content-Length (ya que esto no se conoce de antemano). Puede vaciar la respuesta utilizando flush() periódicamente para forzar al servidor a transmitir lo que ha almacenado hasta el momento para el cliente.

Por lo tanto, si va a hacer cosas que llevan mucho tiempo y desea permitir que la página se visualice con anticipación, la forma correcta de hacerlo sería generar la mayor cantidad posible de la página, llame al flush(), y luego haga sus costosas tareas. Solo asegúrese de no tomar más tiempo que la duración máxima del script PHP declarado.


Bueno, por lo que la explicación es cierto que un poco simplificado:

La cabecera Content-Length realidad puede ser enviada en algunas circunstancias. Por ejemplo, si la respuesta del guión es menor que el búfer de PHP para los datos enviados, y/o si el guion tarda menos tiempo en ejecutarse, el servidor sabrá exactamente cuánto dura el contenido y puede agregar el encabezado de longitud.

Además, flush()en realidad no puede hacer nada. Esto depende de la configuración de su servidor y de otros factores. Nota específicamente estas advertencias en la documentación con respecto al comportamiento del lado del servidor:

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

Varios servidores, especialmente en Win32, aún almacenan en búfer la salida de su secuencia de comandos hasta que finaliza antes de transmitir los resultados al navegador.

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

En otras palabras: prueba, prueba, prueba. Asegúrese de que el servidor web no interfiera con el comportamiento que está tratando de lograr. Vuelva a configurar el servidor web si es necesario.

+0

¡Gran respuesta, gracias! –

Cuestiones relacionadas