Как предварительно сжать очень большие HTML-файлы - PullRequest
10 голосов
/ 16 июня 2010

Мне нужно предварительно сжать некоторые очень большие файлы html / xml / json (большие дампы данных), используя gzip или deflate.Я никогда не хочу обслуживать файлы без сжатия.Они настолько большие и повторяющиеся, что сжатие, вероятно, будет работать очень и очень хорошо, и хотя некоторые старые браузеры не поддерживают декомпрессию, мои обычные клиенты не будут их использовать (хотя было бы неплохо, если бы я мог генерировать что-то вроде «эй, вам нужнообновить сообщение браузера)

Я автоматически генерирую файлы и могу легко сгенерировать файлы .htaccess для каждого типа файлов.По сути, я всегда хочу использовать версию mod_gunzip .Поскольку файлы велики, и потому что я буду неоднократно их обслуживать, мне нужен метод, который позволит мне действительно хорошо сжать один раз в командной строке.

Я нашел некоторую информацию на этом сайте и другие о том, как это сделать с помощью gzip, но мне было интересно, может ли кто-нибудь рассказать мне, как это сделать с помощью deflate.Бонусные баллы за полный ответ, который включает то, как должен выглядеть мой файл .htaccess, а также код командной строки, который я должен использовать (GNU / Linux) для получения оптимального сжатия.Супер бонусные баллы за ответ, в котором также рассказывается, как отправить сообщение «Извините, нет файла для вас» в несовместимых браузерах.

было бы неплохо, если бы мы могли создать тег "precompression", чтобы охватить подобные вопросы.

-FT

Ответы [ 4 ]

8 голосов
/ 20 июня 2010

Редактировать: Найдено Добавить кодирование в mod_mime

Это работает:

<IfModule mod_mime.c>
 <Files "*.html.gz">
  ForceType text/html
 </Files>
 <Files "*.xml.gz">
  ForceType application/xml
 </Files>
 <Files "*.js.gz">
  ForceType application/javascript
 </Files>
 <Files "*.gz">
  AddEncoding gzip .gz
 </Files>
</IfModule>

Документы заставляют его звучать так, как будто нужен только AddEncoding, но я не получил этого.

Кроме того, mod_compression Lighttpd может сжимать и кэшировать (сжатые) файлы.

3 голосов
/ 22 июня 2010

На вашем месте я бы посмотрел на сжатие встроенной файловой системы вместо того, чтобы делать это на уровне apache.

В Solaris zfs имеет прозрачное сжатие, используйте сжатие zfs, чтобы просто сжать файловую систему.Аналогично, окна могут сжимать папки, apache будет обслуживать контент, не обращая внимания на тот факт, что он сжат на диске.В Linux есть файловые системы, которые также выполняют прозрачное сжатие.

2 голосов
/ 21 июня 2010

Для командной строки скомпилируйте zpipe zlib: http://www.zlib.net/zpipe.c, а затем

zpipe < BIGfile.html > BIGfile.htmlz

например.

Затем, используя пример Zash, установите фильтр для изменения заголовка. Это должно обеспечить вам файлы RAW deflate, которые современные браузеры , вероятно, поддерживают .

Для другого способа сжатия файлов посмотрите на использование pigz с опциями сжатия zlib (-z) или PKWare zip (-K). Проверьте, работают ли они с установленным Content-Encoding.

0 голосов
/ 16 июня 2010

Быстрый способ сжатия содержимого без непосредственного обращения к moz_gzip / mod_defalte - использование ob_gzhandler и изменение заголовков (перед отправкой любого вывода в браузер).

<?php
/* Replace CHANGE_ME with the correct mime type of your large file. 
 i.e: application/json
*/

ob_start ('ob_gzhandler');
header('Content-type: CHANGE_ME; charset: UTF-8');
header('Cache-Control: must-revalidate');
$offset = 60 * 60 * 2 ;
$ExpStr = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT';
header($ExpStr);

/* Stuff to generate your large files here */
...