2008-12-09 26 views
23

Acabo de leer esta publicación: https://developer.yahoo.com/performance/rules.html#flush y ya he implementado una descarga después de cargar la parte superior de mi página (head, css, top banner/search/nav).PHP Flush: frecuencia y mejores prácticas

¿Hay algún golpe de rendimiento en el lavado? ¿Hay algo así como hacerlo con demasiada frecuencia? ¿Cuáles son las mejores prácticas?

Si voy a presionar una API externa para obtener datos, ¿tendría sentido enjuagar de antemano para que el usuario no espere que esos datos vuelvan, y al menos obtener algunos datos de antemano?

+1

Dado que esto aún se está leyendo: considere en su lugar algunos procesos asíncronos con notificaciones de resultados a través, p. Ej. websockets. (Esto no era una cosa cuando se hizo la pregunta) – Piskvor

Respuesta

19

La técnica descrita se ve bien, pero tiene varios escollos:

1) el tiempo entre el inicio y el final script PHP es pequeño en comparación con el tiempo de transmisión; también, esto le ahorra al usuario aproximadamente 0.5 segundos, según su fuente. ¿Es una cantidad de tiempo significativa para ti?

2) esta técnica no funciona con búfer de salida gzip

3) si se enjuaguen con demasiada frecuencia, se le envía un paquete casi vacío en color, que en realidad podría aumentar el tiempo de carga (en lenta , conexiones ruidosas).

4) una vez que al ras, no se puede enviar ningún más cabeceras

5) (problema menor) la respuesta del servidor vendrá en la codificación fragmentada, lo que significa que el cliente no sabrá el tamaño de antemano (por lo tanto, no mostrará "x% done" al descargar un archivo).

Por otro lado, si espera que su script se ejecute durante mucho tiempo (más de 20 segundos), puede ser necesario enviar algunos datos (espacios, por ejemplo) para evitar que el navegador agote la conexión.

5

El lado malo es que no se puede descomprimir el contenido y enjuagarlo, por lo que siempre he preferido gzip en lugar de enjuagarlo.

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

Esto hace que esto no idea, ya que parece carnes de más datos no es muy útil.

+0

Estoy de acuerdo, sin embargo, la mayoría de las personas tienen más metadatos dentro de sus etiquetas que 256 caracteres. En realidad, no es mucho si lo piensas. GZip es un buen punto sin embargo. –

2

Según el punto de Piskvor: si espera una espera de más de 20 segundos, puede ser mejor que proporcione una página básica (que se puede descomprimir) y usar Ajax para actualizar la página cuando el proceso lento haya finalizado. Sin embargo, comienzas a infringir la utilidad básica de html estático.

3

Creo que el enjuague es realmente un mecanismo de ajuste fino. Los navegadores solo usan alrededor de 8 subprocesos para descargar contenido (depende del navegador). Si tiene 15 imágenes, el navegador comenzará a descargar 8 imágenes y no descargará nada hasta que una de ellas finalice, luego comenzará la descarga de la siguiente imagen, etc. Al enjuagar después del encabezado, básicamente le está diciendo al navegador qué puede comenzar a descargar. Cuando se entregue el resto de la página (es decir, 5 segundos más tarde), es posible que el navegador ya haya terminado de descargar los archivos css y javascript. Esto liberaría subprocesos de descarga para otro contenido.

Probablemente no desee utilizar flush en ningún otro lugar que no sea justo después del encabezado. Por lo general, un navegador no procesa las etiquetas html sin cerrar, por lo que la entrega de una página parcial no mostrará las cosas más rápido. Las versiones anteriores de IE no mostrarán nada hasta que se reciba una cierta cantidad de datos o se complete la entrega de la página.