Блог инженера-программиста / шапку скоро поменяю /

Сжимаем Web-документы

Зачем нужно сжимать web-документы, объяснять не нужно — меньше трафика, быстрее скорость загрузки — этого, думаю, достаточно.

Сейчас большинство браузеров и многие сайты поддерживают gzip-сжатые страницы. Механизм сжатия таков: сервер по заголовкам клиента смотрит, принимает ли тот сжатые страницы, и при положительном ответе применяет gzip-сжатие. Если же сжатие не поддерживается, то пользователю отдается обычная, не сжатая версия документа.

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

Приступим к подключению gzip-сжатия на сайт. Самый простой вариант — добавить в главный скрипт (или в header) php-команду:

1
ob_start("ob_gzhandler");

Но это не самый правильный вариант — на сервере уже может быть настроено сжатие, и пережимать еще раз нет смысла. Погуглив немного и пособирав данные из разных источников я пришел к такой реализации сжатия:
В файл .htaccess в корне сайта добавляем:

1
2
php_flag zlib.output_compression On
php_value zlib.output_compression_level 9

Таким образом включаем сжатие на сервере и устанавливаем максимальный уровень сжатия. Но иногда это может не работать, поэтому дополнительно в «главный» скрипт, до старта сессии нужно добавить:

1
if(!ini_get('zlib.output_compression')) ob_start("ob_gzhandler");

В этом случае если не включена zlib-компрессия (она рекомендуется для использования больше чем ob_start(«ob_gzhandler»)), то включается сжатие ob_start(«ob_gzhandler»).

Таким образом страница об удаленной перезагрузке Apache и MySQL вместо 26,22 килобайт весит всего лишь 6,07 Кб, т.е. экономия трафика около 77% (как серверу, так и юзеру).

Но, как оказывается, есть проблема — разные баннерорезки и Outpost Firewall не передают данные браузера о поддержке gzip-сжатия, и сервер отправляет браузеру страницу без сжатия. (У меня Outpost Firewall Pro ver. 4.0.1007.7323 (590) точно не отдает эти данные), правда более новые версии Outpost уже не режут этот заголовок. Для того, чтоб заголовок не убирался необходимо (и достаточно) выполнить reg-файл со следующим содержимым (перед запуском обязательно выгрузите Outpost из памяти):

1
2
3
4
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall]
"EnableGzipEncoding"=dword:00000001

После этого браузер будет получать сжатую версию страницы.

Комментирование закрыто.