2010-08-13 16 views
7

Estoy trabajando en un script PHP que genera grandes resultados (multi-MB) sobre la marcha sin conocer la longitud por adelantado. Estoy escribiendo directamente en php://output a través de fwrite() y he intentado con la salida estándar y usando Transfer-Encoding: chunked (codificando los fragmentos según sea necesario) pero no importa lo que intento, el navegador espera hasta que se escriban todos los datos antes de mostrar un diálogo de descarga. He intentado flush() también después de los encabezados y después de cada fragmento, pero esto tampoco hace ninguna diferencia.Caché de salida de Apache/PHP

Supongo que Apache está almacenando en caché el resultado ya que el navegador normalmente se mostraría después de recibir unos pocos kB del servidor.

¿Alguien tiene alguna idea sobre cómo detener este almacenamiento en caché y vaciar los datos en el navegador a medida que se generan?

Gracias, J

+1

En lugar de adivinar que apache no se va a enjuagar hasta que se generen todos los contenidos, sugiero usar wireshark o herramientas similares para _ver_ qué datos se están enviando al navegador. Inserta algunas llamadas 'sleep (1)' si necesitas reducir la velocidad. (Dudo que Apache mantenga varios megabytes en un solo socket antes de enjuagar sus buffers). – sarnold

+3

Supongo que tiene habilitada la compresión GZIP en php.ini y/o apache config. En ese caso, apache siempre se almacena en caché. No he encontrado una forma de evitar esto (aparte de deshabilitar la compresión), así que veamos lo que otras personas saben acerca de esto. Podría ser una pregunta para serverfault.com, aunque ... – BlaM

+0

@sarnold - Cuando digo que supongo que es una suposición educada ya que he estado rastreando la solicitud a través de Fiddler y no veo ninguna respuesta hasta que aparezca el diálogo de descarga así que estoy bastante seguro de que está almacenando en caché en el lado del servidor. @BlaM: tiene toda la razón al decir que GZIP está habilitado, no pensé en eso como una posible causa, ya que es un algoritmo de compresión de transmisión, pero ese puede ser el problema. Voy a tratar de deshabilitar este script en particular y ver qué pasa. Gracias. – JWood

Respuesta

1

En primer lugar, al igual que Blam mencionó en su comentario, si en el OutputBuffering configuración de PHP está habilitada, no lo puedo trabajar, por lo que sería útil conocer su phpinfo().

A continuación, intente si funciona con un archivo grande que está almacenado en su servidor web, déle salida usando el archivo de lectura. Y, junto con esto, verifique si envía los encabezados correctos. Consejos sobre cómo readfile() y enviar las cabeceras correctas A proporcionado aquí: StackOverflow: How to force a file download in PHP

Y mientras usted está en él, llame ob_end_flush() o ob_end_clean() en la parte superior de su script.

Cuestiones relacionadas