Как работает GZipping на стороне сервера? - PullRequest
7 голосов
/ 09 августа 2009

Возможно, вы знаете, что связанные с HTML форматы файлов сжимаются с использованием сжатия GZip на стороне сервера ( mod_gzip на серверах Apache) и распаковываются совместимыми браузерами. («кодирование содержимого»)

Это работает только для файлов HTML / XML? Допустим, мой файл PHP / Perl генерирует некоторые простые данные, разделенные запятыми, и отправляет их в браузер, будет ли они кодироваться по умолчанию?

Как насчет платформ, таких как Silverlight или Flash, когда они загружают такие данные, они автоматически сжимаются / распаковываются браузером / средой выполнения? Есть ли способ проверить это?

Ответы [ 3 ]

9 голосов
/ 09 августа 2009

Это работает только для HTML / XML файлы

Нет: он довольно часто используется, например, для файлов CSS и JS - поскольку они являются одной из самых больших вещей, из которых сделаны веб-сайты (кроме изображений), из-за каркасов JS и полнофункциональных приложений JS он представляет собой огромный выигрыш!

На самом деле любой текстовый формат может быть сжат очень хорошо (напротив, изображения не могут, например, так как они, как правило, уже сжаты) ; иногда данные JSON, возвращаемые из Ajax-запросов, тоже сжимаются - это, в общем, текстовые данные; -)

Допустим, мой PHP / Perl файл генерирует некоторые простые данные, разделенные запятыми, и отправляет это в браузер, это будет кодируется по умолчанию?

Это вопрос конфигурации: если вы сконфигурировали свой сервер для сжатия такого рода контента, он, вероятно, будет сжат :-)
(если браузер сообщает, что принимает данные в формате gzip)


Вот пример конфигурации для Apache 2 (с использованием mod_deflate), который я использую в своем блоге:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/xml
</IfModule>

Здесь я хочу, чтобы html / xml / css / JS te был сжат.

И здесь то же самое, плюс / минус несколько опций конфигурации, которые я использовал один раз под Apache 1 (mod_gzip):

<IfModule mod_gzip.c>
    mod_gzip_on                   Yes
    mod_gzip_can_negotiate        Yes

    mod_gzip_minimum_file_size    256
    mod_gzip_maximum_file_size    500000

    mod_gzip_dechunk              Yes

    mod_gzip_item_include         file       \.css$
    mod_gzip_item_include         file       \.html$
    mod_gzip_item_include         file       \.txt$
    mod_gzip_item_include         file       \.js$
    mod_gzip_item_include         mime       text/html

    mod_gzip_item_exclude         mime       ^image/
</IfModule>

Здесь можно заметить, что я не хочу, чтобы слишком маленькие (усиление не было бы очень важным) или слишком большие (потребляли бы слишком много ЦП для сжатия) файлы для сжатия; и я хочу, чтобы файлы css / html / txt / js были сжаты, но не изображения.


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

Есть ли способ проверить это?

Для любого содержимого, возвращаемого непосредственно в браузер, расширения Firefox Firebug или LiveHTTPHeaders являются обязательными.

Для контента, который не проходит через стандартный способ связи браузера, это может быть сложнее; в конце концов, вам, возможно, придется использовать что-то вроде Wireshark , чтобы "понюхать" то, что на самом деле идет по трубам ... Удачи с этим!

А как насчет платформ вроде Silverlight или Flash, когда они загружают такие данные, они будут сжаты / распакованы через браузер / время выполнения автоматически?

Чтобы ответить на ваш вопрос о Silverlight и Flash, если они отправляют заголовок Accept, указывающий, что они поддерживают сжатый контент, Apache будет использовать mod_deflate или mod_gzip. Если они не поддерживают сжатие, они не отправят заголовок. Это будет «просто работать». - Нейт

5 голосов
/ 09 августа 2009

Я думаю, что Apache mod_deflate встречается чаще, чем mod_gzip, потому что он встроен и делает то же самое. Посмотрите документацию для mod_deflate (ссылка выше), и вы увидите, что легко указать, какие типы файлов сжимать, основываясь на их типах MIME. Как правило, стоит сжать HTML, CSS, XML и JavaScript. Изображения уже сжаты, поэтому они не выигрывают от сжатия.

4 голосов
/ 09 августа 2009

Браузер отправляет заголовок «Accept-Encoding» с типами сжатия, которые он знает, как понимать.Сервер смотрит на это вместе с агентом пользователя и решает, как закодировать результат.Некоторые браузеры лгут о том, что они могут понять, поэтому это сложнее, чем просто искать «deflate» в заголовке.

Технически, любой ответ HTTP / 2xx с контентом может быть закодирован с использованием любого изкодировки содержимого (gzip, zlib, deflate и т. д.), но на практике применять сжатие к распространенным типам изображений бесполезно, потому что это на самом деле делает их больше.Самый простой способ - добавить:

<?php ob_start("ob_gzhandler"); ?>  

в начало каждой страницы PHP.Конечно, лучше настроить его через конфигурацию PHP.

Существует множество тестовых страниц, которые легко найти с помощью Google :

...