Примечание: ниже находится перевод очередной заметки от Steve Souders Flushing the Document Early. Теперь автор рассматривает вопрос максимально быстрой передачи HTML-кода браузера путем сброса буферов вывода (flush). Мои комментарии далее курсивом.
Эта заметка является частью моей новой книги Even Faster Web Sites. Предыдущие заметки в этой серии включают: chapters and contributing authors, Splitting the Initial Payload, Загружаем скрипты без блокировки, Стыкуем асинхронные скрипты, Размещаем внутренние скрипты и Балансируем основной домен.
Золотое правило производительности гласит, что для большинства сайтов 80-90% времени загрузки приходится на клиентскую часть. Однако для некоторых страниц время, затрачиваемое сервером на создание HTML-документа, больше, чем 10-20% общего времени загрузки страницы. Даже если HTML-документ быстро создается на сервере, все равно может потребоваться значительное время для его доставки браузеру для тех пользователей, которые находятся слишком далеко или имеют медленный канал связи. Тут мне кажется, что Steve немного смешивает проблемы. Если мы отдадим с сервера документ моментально, то это никак не отразится на скорости его появления у пользователя с медленным соединением: задержка из-за канала никак не связана с задержкой из-за самого сервера. Нам все равно, когда сервер отдаст очередной кусок данных (сейчас или через 100мс), если этот кусок будет идти к пользователю целую секунду. Пока HTML-документ создается на сервере и отправляется пользователю, браузер будет ждать в «подвешенном» режиме. Ерунда какая-то получается. Вместо того чтобы заставлять браузер простаивать, веб-разработчики могли бы сбросить часть документа на выдачу, чтобы браузер мог начать отображение хотя бы какой-то части страницы, пока не получит весь документ.
Сброс (flushing) происходит в тот момент, когда сервер отправляет часть HTML-данных пользователю еще до того, как ответ готов полностью. Все современные браузеры умеют отображать частично готовый ответ. При правильной настройке сброс документа приводит к визуально более быстрой скорости загрузки (когда страница появляется в браузере не вся сразу, а частями, но похожее поведение можно увидеть и при последовательном анализе и отображении страницы самим браузерами, например, в случае больших таблиц или блокирующих скриптов). Ключевой момент здесь заключается в правильном выборе точки сброса HTML-документа. Сброс должен происходить до того, как начинаются ресурсоемкие вычисления (например, запросы к базе данных или вызов других веб-сервисов). Но при этом сброс должен происходить после того, как исходный HTTP-ответ наберет достаточно данных для загрузки браузера. Сбрасываемая часть HTML-Документа должна содержать как ссылки а внешние ресурсные файлы, так и часть видимой пользователю информации (наверное, наиболее оптимально будет показать пользователю шапку сайта, если для ее создания не производятся запросы к базе). Если браузер получит ссылки на статические файлы (например, таблица стилей, внешние скрипты и картинки) в первую очередь, то это поможет существенно ускорить отображение страницы (фактически параллельно с серверной работой по созданию HTML-страницы будет вестись работа на стороне браузера по запросу статических файлов). Если в браузере пользователя появится хоть какая-то информация, то визуально скорость загрузки существенно возрастет.
Большинство серверных языков по созданию HTML-шаблонов, включая PHP, Perl, Python и Ruby, содержат специальную функцию flush
. Однако заставить ее правильно работать может быть весьма проблематично. Проблемы начинаются тогда, когда выходной поток буферизуется, отключена «кусочная» (chunked) кодировка, дополнительно функционируют прокси-сервера или антивирусные программы, а также если размер сбрасываемого содержимого слишком мал. Если посмотреть на комментарии к документации PHP-функции flush
, то можно сделать вывод, что добиться правильной работы всех звеньев бывает крайне тяжело. Возможно, именно поэтому большинство сайтов в США из 10 наиболее посещаемых не используют быстрый сброс документа. Единственное исключение составляет поиск Google.
Поиск Google быстро сбрасывает документ
Диаграмма загрузки для поиска Google показывает преимущества быстрого сброса документа. Пока происходит передачи HTML-документа в запросе (первая полоска), браузер уже начал загружать одну из картинок, вызываемых на странице, nav_logo4.png (вторая полоска). Быстрый сброс документа позволяет раньше начать отображение страницы и загрузку ресурсов, на ней используемых. Это именно то, что любят пользователи. Особенно при медленном соединении с интернетом или наличии больших сетевых задержек.
В качестве финального замечания стоит упомянуть, что детальной документации на тему сброса документа в интернете практически нет (очень много нюансов применения и настройки серверного окружения). Именно поэтому эта техника распространена очень слабо, хотя может существенно помочь в рде «тяжелых» случаев.