Буферизация вывода и сжатие страниц в PHP
Что может огорчать посетителя Вашей страницы? Конечно, многое :). Но не на последнем месте стоит скорость и плавность загрузки. Поэтому поговорим о буферизации вывода и сжатии страниц в PHP.
Начнем с обычной буферизации. Для начала нам нужно это дело включить (делается перед всеми выводами, иначе смысл этого действия пропадает):
Теперь все, что выводит наш скрипт, будет попадать не прямиком юзеру, а в буфер. Конечно, в конце скрипта надо пользователю показать все выведенное:
-
echo $content;
Эти две строки очищают буфер и выводят его содержимое. Вот, собственно, и все. Теперь пользователь будет видеть результаты работы скрипта только после его завершения (точнее, после вызова упомянутых двух строк). В принципе, эти строки не обязательны. PHP автоматически выведет содержимое буфера после завершения скрипта.
Теперь перейдем к сжатию. По сути, это – логическое продолжение буферизации вывода. Только теперь мы будем архивировать то, что посылается пользователю. Таким образом, мы заметно сэкономим трафик.
Нужно учитывать, что не все браузеры поддерживают принятие сжатого контента. Кроме того, необходимо, чтобы на сервере при компиляции PHP был подключен zlib. Поэтому перед основной работой проверим, можем ли мы использовать блага архивации:
-
global $GZIP_COMPRESSION_ON;
-
-
$GZIP_COMPRESSION_ON =
-
and
Теперь смело включаем уже знакомую нам буферизация:
Можно еще добавить запрет на вывод буфера без нашего на то указания:
Но это не очень хорошая идея, поскольку если у нас где-то до полноценного вывода данных встретится, например, вызов die(), то юзер не увидит ничего, что выводилось до этого.
Ну а в конце выводим данные несколько другим способом:
Все просто, не правда ли? Проверяем, можно ли использовать сжатие. Если да – выдаем корректный header и сжатый контент. Если нет – ничего не сжимаем.
Есть и второй путь. Можно все это проделать одной строкой:
О дальнейшем выводе можно не думать. Но у такого подхода есть существенный минус. При использовании mod_rewrite будет выдаваться ошибка. И данные сжиматься не будут. У предыдущего подхода такого недостатка нет.
Также недавно был найден третий способ, который хорошо работает с mod_rewrite и который легко прикрутить к уже готовому сайту.
Делаем два файла:
begin_gzip.php
-
<?php
-
?>
end_gzip.php
-
<?php
-
?>
Затем в настройках данного хоста в Apache (можно и в .htaccess) пишем:
-
php_value auto_prepend_file /полный/путь/до/begin_gzip.php
-
php_value auto_append_file /полный/путь/до/end_gzip.php
P.S. Прочтение данной статьи не освобождает от прочтения документации, ибо в с статье не описаны многие нюансы происходящего.
P.P.S. Инструкцию по тому, как собрать PHP с поддержкой zlib можно найти у нас на сайте.

