ob_start gc_collect_cycles php optimization flush

gc_collect_cycles - Escalera PHP: frecuencia y mejores prácticas



php free memory (4)

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

1) el tiempo entre el comienzo y el final del 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 el buffering de salida gzip

3) si se sonroja con demasiada frecuencia, enviará un paquete casi vacío en color, lo que en realidad podría aumentar el tiempo de carga (en conexiones lentas y ruidosas).

4) una vez que enjuagues, no puedes enviar más encabezados

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

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

Acabo de terminar de leer esta publicación: https://developer.yahoo.com/performance/rules.html#flush y ya he implementado un color después de cargar la parte superior de mi página (head, css, top banner / search / nav) .

¿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 enjuagarlos de antemano para que el usuario no espere que vuelvan esos datos y, al menos, obtener algunos datos de antemano?


Siguiendo el punto de Piskvor, si esperas una espera de más de 20 segundos, es mejor que proporciones una página básica (que puede ser comprimida) y usar Ajax para actualizar la página cuando el proceso lento haya terminado. Sin embargo, comienzas a infringir la utilidad básica de html estático.


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. En el momento en que 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 otro lugar que no sea inmediatamente 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.


La desventaja es que no se puede descomprimir el contenido y enjuagarlo, así que siempre prefiero usar gzip en lugar de enjuagar.

Algunas versiones de Microsoft Internet Explorer solo comenzarán a mostrar la página después de que hayan recibido 256 bytes de salida, por lo que es posible que deba enviar espacios en blanco adicionales antes de descargar para que esos navegadores muestren la página.

Esto hace que esto no sea una idea, ya que parece que el relleno de más datos no es muy útil.