PHP

Буферизация вывода и сжатие страниц в PHP

Что может огорчать посетителя Вашей страницы? Конечно, многое :). Но не на последнем месте стоит скорость и плавность загрузки. Поэтому поговорим о буферизации вывода и сжатии страниц в PHP.

Начнем с обычной буферизации. Для начала нам нужно это дело включить (делается перед всеми выводами, иначе смысл этого действия пропадает):

ob_start();

Теперь все, что выводит наш скрипт, будет попадать не прямиком юзеру, а в буфер. Конечно, в конце скрипта надо пользователю показать все выведенное:

$content = ob_get_clean();
echo $content;

Эти две строки очищают буфер и выводят его содержимое. Вот, собственно, и все. Теперь пользователь будет видеть результаты работы скрипта только после его завершения (точнее, после вызова упомянутых двух строк). В принципе, эти строки не обязательны. PHP автоматически выведет содержимое буфера после завершения скрипта.

Теперь перейдем к сжатию. По сути, это вЂ‛ логическое продолжение буферизации вывода. Только теперь мы будем архивировать то, что посылается пользователю. Таким образом, мы заметно сэкономим трафик.

Нужно учитывать, что не все браузеры поддерживают принятие сжатого контента. Кроме того, необходимо, чтобы на сервере при компиляции PHP был подключен zlib. Поэтому перед основной работой проверим, можем ли мы использовать блага архивации:

global $GZIP_COMPRESSION_ON;

$GZIP_COMPRESSION_ON =
  (strstr($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false)
  and
  (extension_loaded("zlib"));

Теперь смело включаем уже знакомую нам буферизация:

ob_start();

Можно еще добавить запрет на вывод буфера без нашего на то указания:

ob_implicit_flush(0);

Но это не очень хорошая идея, поскольку если у нас где-то до полноценного вывода данных встретится, например, вызов die(), то юзер не увидит ничего, что выводилось до этого.

Ну а в конце выводим данные несколько другим способом:

global $GZIP_COMPRESSION_ON;

$content = ob_get_clean();
if ($GZIP_COMPRESSION_ON) {
  header("Content-Encoding: gzip");
  echo gzencode($content, 9);
}
else {
  echo $content;
}

Все просто, не правда ли? Проверяем, можно ли использовать сжатие. Если да вЂ‛ выдаем корректный header и сжатый контент. Если нет вЂ‛ ничего не сжимаем.

Есть и второй путь. Можно все это проделать одной строкой:

ob_start("ob_gzhandler");

О дальнейшем выводе можно не думать. Но у такого подхода есть существенный минус. При использовании mod_rewrite будет выдаваться ошибка. И данные сжиматься не будут. У предыдущего подхода такого недостатка нет.

Прочтение данной статьи не освобождает от прочтения документации, ибо в с статье не описаны многие нюансы происходящего.
Теги:
Буферизация вывода, сжатие страниц
Добавлено: 01 Мая 2018 11:17:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...