|
 |
Путь: >
Общие вопросы
Общие вопросы
Автор: - Yurik
Дата публикации - 21.5.2005
Просмотров: - 5445
Сжатие страниц - экономим трафик и ускоряем загрузку страниц
[p]Что такое сжатие данных[/p]
Многие броузеры поддержывают gzip сжатые файлы в "прозрачном" для пользователя режиме. Для текстовых файлов (HTML страниц) коефициент сжатия этим методом составляет 0.2-0.3, т.е. данные сжимаются в 3-5 раз (на бОльших файлах - больше), что даёт такое же ускорение закачки страницы при других равных условиях.
[p]Что снижает ефективность использования сжатия данных[/p]
Ефект от сжатия снижается, если вы используете много графики (GIF, JPEG, PNG), Flash (SWF), других мультимедиа. Но если большинство данных у вас текстовые и ХТМЛ страница занимает более 50кб - смело используйте сжатие.
Ефект от использования сжатия снижается также при использовании современных модемных протоколов. Вот что говорят их производители:
[quote]Протоколы сжатия данных (V.44/V.42 bis/MNP 5) и коррекции ошибок (V.42/MNP 2-4) поддерживаются для максимизации пропускной способности и проверки целостности передачи. V.44 более ефективный метод сжатия чем V.42 bis, что существенно увеличивает возвратную пропускную способность и таким образом, уменьшая время закачки для типов файлов, используемых в Интернет, таких какe Веб-страницы и несжатая графика, аудио, документы. Сжатие по протоколу V.44 может достигать уровня более чем на 25% ефективнее чем V.42bis. Типичный коефициент сжатия для V.44 на Веб-страницах около 6-1, что в конечном итоге дает пропускную способность до 300 kbps для 56-kbps соединений.[/quote]
Поэтому ефект во времени загрузки может быть не совсем ощутимый. Тем не менее использование сжатия данных оправдано. Во-первых, алгоритм gzip более ефективный апаратного сжатия данных (он всего на 17% уступает RAR-формату и на 2% - ZIP), в большей части благодаря тому, что вы сжимаете весь файл заразом, а модем - только текущие пакеты. Во-вторых, суммарная пропускная способность канала всегад меньше наиболее его "тонкого" места, т.е. если на какой то стадии используется более старый протокол, ефекта от апаратного сжатия конечный пользователь не получит.
[p]Как узнать, поддерживает ли броузер сжатие[/p]
Если переменная окружения HTTP_ACCEPT_ENCODING содержит "gzip" или "x-gzip", значит поддерживает. Узнать об этом в PHP можно проверив переменную $HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'] на вхождение "gzip";
[p]PHP имеет встроенные функции сжатия?[/p]
Для того, чтобы использовать сжатие, ПХП должен быть скомпилирован с библиотекой zlib. Её можна скачать здесь: url=http://www.gzip.org/zlib,]http://www.gzip.org/zlib,/url] но имеется она и в дистрибутиве PHP. При запуске "configure" нужно указать параметр --with-zlib или --with-zlib=/path/to/zlib (Если вы используете быблиотеку не из дистрибутива). Пользователи Windows должны прописать в php.ini "extension=php_zlib.dll" (Естественно, php_zlib.dll должен быть в папке указанной в параметре "extension_dir=C:\php\extensions")
[p]Насколько быстро работает фунцкция сжатия?[/p]
На процессоре P166MMX gzencode сжимает около 600-700 kb в секунду
[p]Как сжать страницу[/p]
Для сжатия страницы можно использовать два способа:
[ol]
[li]Весь вывод делать не через echo, а в отдельную переменную.[/li]
[li]Весь вывод делать в буфер вывода, поставив в начале страницы[/li]
[php]
<?php
ob_start(); //буферизация вывода
ob_implicit_flush(0); // выдача буфера только по команде ob_end_flush()
?>[
/php]
[/ol]
Когда вывод страницы окончен, мы получаем содержимое буфера через
[php]
$page = ob_get_contents();[
/php]
и сжимаем его функцией
[php]
$page = gzencode($page);[
/php]
[nb]Перед выводом сжатой страницы нужно послать правильные заголовки[/nb]
[php]
header('Content-Encoding: gzip');
header('Vary: Accept-Encoding');
header('Content-Length: ' . strlen($page));[
/php]
Конечно можно все это делать ручками, а можно и использовать классы PEAR "HTTP_Compress" и "Cache_OutputCompression". А ещё проще сохранить себе этот файл:
[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]
и включать его в нужные страницы:
[php]
<?php
include('zip.php');
start();
/*
Cтраница
*/
output();
?>[
/php]
Обсудить в ФОРУМе - комментариев ()
Путь: >
Общие вопросы
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|