PHP Flush: как часто и лучшие практики

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

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

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


person Cory Dee    schedule 09.12.2008    source источник
comment
Поскольку это все еще читается: рассмотрите вместо этого некоторую асинхронную обработку с уведомлениями о результатах, например. веб-сокеты. (Это не было вещью, когда был задан вопрос)   -  person Piskvor left the building    schedule 27.01.2017


Ответы (4)


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

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

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

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

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

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

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

person Piskvor left the building    schedule 09.12.2008

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

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

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

person Rich Bradshaw    schedule 09.12.2008
comment
Однако я согласен с тем, что у большинства людей внутри тегов head содержится больше метаданных, чем 256 символов. Это не так уж и много, если подумать. Однако GZip — это хорошо. - person Cory Dee; 09.12.2008

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

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

person Brent Baisley    schedule 30.03.2010

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

person Phil H    schedule 09.12.2008