::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Вакансия PHP-программист, Днепропетровск...
  - Проблема с передачей переменной в PHP ск...
  - Как хранить конфигурацию cms'ки?
  - Проблема с сортировкой массива
  - коллизии md5
  - Странный глюк функции date
  - Скроллинг в iframe


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Общие вопросы

Общие вопросы

Автор: - 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.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005