"Умное" сжатие GZIP

Как известно, в PHP есть возможность сжимать с помощью GZIP отдаваемые пользователю данные. С одной стороны, оно позволяет сэкономить траффик и увеличить скорость загрузки, что крайне важно для пользователей, подключенных через GPRS или обычные аналоговые модемы, так как сайты сейчас становятся по объему все больше и больше.  С другой — увеличивает нагрузку на сервер: на сжатие требуется дополнительное процессорное время. Кроме того, для пользователей с быстрыми каналами связи эффект от сжатия оказывается настолько незначительным, что время на упаковку/распаковку данных может оказаться вполне сопоставимым со временем, сэкономленным на передаче.

Сразу возникает мысль: а что если как-то определить, как подключен пользователь, и включать сжатие только в тех случаях, если соединение медленное. Измерить скорость подключения пользователя средствами PHP — задача непростая. Но есть и другой вариант: большинство провайдеров сейчас присваивает пользователям через обратный DNS имя хоста, в котором указан тип подключения. Например, broadband-*.nationalcablenetworks.ru или dialup-*.mtu-net.ru.

В PHP это имя хоста можо получить из переменной $_SERVER['REMOTE_HOST'] (для этого нужно, чтобы в настройках Web-сервера было включено определение обратного DNS, в Apache это делается директивой HostnameLookups On). Далее можно просто проверить наличие строк gprs и dialup в имени хоста и включить сжатие при их наличии. Вот пример функции, которая реализует такую проверку:

$userhost = $_SERVER['REMOTE_HOST'];
if (strpos($userhost,'dialup')!==false || strpos($userhost,'gprs')!==false) ob_start('ob_gzhandler');
else ob_start(); 

Конечно, этот вариант тоже не лишен недостатков: во-первых, он не является полностью надежным, а во-вторых, определение обратного DNS тоже создает небольшую дополнительную нагрузку на сервер, но все же он является более гибким решением, чем принудительное включение или выключение сжатия. Аналогичную проверку можно так же использовать при написании правил для mod_rewrite, для выбора, какой файл JavaScript отдать пользователю: упакованный средствами самого JavaScript (но из-за этого требующий больше времени на исполнение) или просто минифицированный.


0