gZip — сжатие данных на PHP

Понедельник, 19 Апр 2010 9:35

gZip - сжатие данных на PHP Многие браузеры поддерживают gzip сжатые файлы в "прозрачном" для пользователя режиме. Для текстовых файлов (html страниц) коэффициент сжатия этим методом составляет 0.2-0.3, т.е. данные сжимаются в 3-5 раз (на больших файлах — больше), что даёт такое же ускорение закачки страницы при других равных условиях.

Что снижает эффективность использования сжатия данных. Эффект от сжатия снижается, если вы используете много графики (gif, jpeg, png), flash (swf), других мультимедиа. Но если большинство данных у вас текстовые и ХТМЛ страница занимает более 50кб — смело используйте сжатие. Эффект от использования сжатия снижается также при использовании современных модемных протоколов.

Вот что говорят их производители: Протоколы сжатия данных (v.44/v.42 bis/mnp 5) и коррекции ошибок (v.42/mnp 2-4) поддерживаются для максимизации пропускной способности и проверки целостности передачи. v.44 более эффективный метод сжатия чем v.42 bis, что существенно увеличивает возвратную пропускную способность и таким образом, уменьшая время закачки для типов файлов, используемых в Интернет, таких как Web-страницы и несжатая графика, аудио, документы. Сжатие по протоколу v.44 может достигать уровня более чем на 25% эффективнее чем v.42bis. Типичный коэффициент сжатия для v.44 на Веб-страницах около 6-1, что в конечном итоге дает пропускную способность до 300 kbps для 56-kbps соединений. Поэтому эффект во времени загрузки может быть не совсем ощутимый. Тем не менее использование сжатия данных оправдано. Во-первых, алгоритм gzip более эффективный аппаратного сжатия данных (он всего на 17% уступает rar-формату и на 2% — zip), в большей части благодаря тому, что вы сжимаете весь файл целиком, а модем — только текущие пакеты. Во-вторых, суммарная пропускная способность канала всегад меньше наиболее его "тонкого" места, т.е. если на какой то стадии используется более старый протокол, эффекта от аппаратного сжатия конечный пользователь не получит.

Как узнать, поддерживает ли браузер сжатие?
Если переменная окружения http_accept_encoding содержит "gzip" или "x-gzip", значит поддерживает. Узнать об этом в php можно проверив переменную $http_server_vars[‘http_accept_encoding’] на вхождение "gzip";

php имеет встроенные функции сжатия?
Для того, чтобы использовать сжатие, ПХП должен быть скомпилирован с библиотекой zlib. Её можна скачать здесь: http://www.gzip.org/zlib, но имеется она и в дистрибутиве php. При запуске "configure" нужно указать параметр —with-zlib или —with-zlib=/path/to/zlib (Если вы используете библиотеку не из дистрибутива). Пользователи windows должны прописать в php.ini "extension=php_zlib.dll" (Естественно, php_zlib.dll должен быть в папке указанной в параметре "extension_dir=c:phpextensions")

Насколько быстро работает функция сжатия?
На процессоре p166mmx gzencode сжимает около 600-700 kb в секунду.

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

<?php ob_start(); //буферизация вывода ob_implicit_flush(0); // выдача буфера только по команде ob_end_flush() ?>

Когда вывод страницы окончен, мы получаем содержимое буфера через

<?php $page = ob_get_contents(); ?>и сжимаем его функцией <?php $page = gzencode($page); ?>

Перед выводом сжатой страницы нужно послать правильные заголовки

<?php header(‘content-encoding: gzip’); header(‘vary: accept-encoding’); header(‘content-length: ‘ . strlen($page)); ?>

Конечно можно все это делать ручками, а можно и использовать классы pear "http_compress" и "cache_outputcompression". А ещё проще сохранить себе этот файл: zip.php

<?php function start() { ob_start(); ob_implicit_flush(0); } function output($compress = true, $use_etag = true, $send_body = true) { $min_gz_size = 1024; $page = ob_get_contents(); $length = strlen($page); ob_end_clean(); if ($compress && extension_loaded(‘zlib’) && (strlen($page) >$min_gz_size) && isset($globals[‘http_server_vars’][‘http_accept_encoding’])) { $ae = explode(‘,’, str_replace(‘ ‘, », $globals[‘http_server_vars’][‘http_accept_encoding’])); $enc = false; if (in_array(‘gzip’, $ae)) { $enc = ‘gzip’; } else if (in_array(‘x-gzip’, $ae)) { $enc = ‘x-gzip’; } if ($enc) { $length = strlen($page); header(‘content-encoding: ‘ . $enc); header(‘vary: accept-encoding’); } else { $compress = false; } } else { $compress = false; } if ($use_etag) { $etag = ‘"’ . md5($page) . ‘"’; header(‘etag: ‘ . $etag); if (isset($globals[‘http_server_vars’][‘http_if_none_match’])) { $inm = explode(‘,’, $globals[‘http_server_vars’][‘http_if_none_match’]); foreach ($inm as $i) { if (trim($i) == $etag) { header(‘http/1.0 304 not modified’); $send_body = false; break; } } } } if ($send_body) { header(‘content-length: ‘ . $length); echo $page; } } ?>

и включать его в нужные страницы:

<?php include(‘zip.php’); start(); /* cтраница */ output(); ?>



Вы можете оставить отзыв или трекбек со своего сайта.
Теги: , ,

Ваш отзыв