PHP Flush: как часто и лучшие практики - PullRequest
23 голосов
/ 09 декабря 2008

Я только что закончил читать этот пост: https://developer.yahoo.com/performance/rules.html#flush и уже произвел сброс после загрузки верхней части моей страницы (head, css, top banner / search / nav).

Есть ли какой-либо удар по производительности при очистке? Есть ли такая вещь, как делать это слишком часто? Каковы лучшие практики?

Если я собираюсь обратиться к внешнему API для данных, имеет ли смысл предварительно очистить данные, чтобы пользователь не ждал возвращения этих данных и мог хотя бы получить некоторые данные заранее?

Ответы [ 4 ]

19 голосов
/ 09 декабря 2008

Описанная методика выглядит красиво, но имеет несколько подводных камней:

1) время между началом и концом PHP-скрипта мало по сравнению со временем передачи; Кроме того, это экономит пользователю около 0,5 секунд, в зависимости от вашего источника. Это значительное количество времени для вас?

2) этот метод не работает с буферизацией вывода gzip

3) если вы выполняете сброс слишком часто, вы будете отправлять почти пустой пакет при сбросе, что может фактически увеличить время загрузки (при медленных и шумных соединениях).

4) после того, как вы сбросите, вы не сможете больше отправлять заголовки

5) (незначительная проблема) ответ сервера будет представлен в виде фрагментированной кодировки, что означает, что клиент не будет заранее знать размер (поэтому не будет отображать «x% done» при загрузке файла).

С другой стороны, если вы ожидаете, что ваш сценарий будет выполняться в течение более длительного времени (20+ секунд), может потребоваться отправить некоторые данные (например, пробелы), чтобы браузер не рассчитывал время ожидания соединения.

5 голосов
/ 09 декабря 2008

Недостатком является то, что вы не можете сжать содержимое, а также очистить его на афике, поэтому я всегда предпочитал gzip, а не сбрасывать.

Некоторые версии Microsoft Internet Explorer начинают отображать страницу только после того, как они получили 256 байтов вывода, поэтому вам может потребоваться отправить дополнительный пробел перед сбросом, чтобы эти браузеры отображали страницу.

Это делает это не идеей, так как кажется, что заполнение большего количества данных не очень полезно.

3 голосов
/ 30 марта 2010

Я думаю, что flush - это механизм точной настройки. Браузеры используют только около 8 потоков для загрузки контента (зависит от браузера). Если у вас есть 15 изображений, браузер начнет загружать 8 изображений и не будет загружать ничего, пока одно из них не будет завершено, затем он начнет загружать следующее изображение и т. Д. После сброса заголовка вы в основном сообщаете браузеру это может начать загрузку. К моменту доставки остальной части страницы (т. Е. Через 5 секунд) браузер, возможно, уже завершил загрузку файлов css и javascript. Это освободит темы загрузки для другого контента.

Вы, вероятно, не хотите использовать флэш в любом другом месте, кроме сразу после заголовка. Браузер обычно не отображает закрытые html-теги, поэтому доставка частичной страницы не будет отображаться быстрее. В старых версиях IE ничего не будет отображаться до тех пор, пока не будет получен определенный объем данных или пока не завершена доставка страниц.

2 голосов
/ 09 декабря 2008

Следуя указаниям Писквора - если вы ожидаете ожидания более 20 с, вам может быть лучше предоставить базовую страницу (которую можно распаковать) и использовать Ajax для обновления страницы после завершения медленного процесса. Однако вы начинаете нарушать основную полезность статического HTML.

...