Как предварительно сжать очень большие html файлы

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

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

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

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

-Ft

Ответ 1

Изменить: Найдено AddEncoding в 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, но я не получил этого, чтобы работать.

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

Ответ 2

Если бы я был вами, я бы посмотрел на встроенное сжатие файловой системы, а не на это на уровне apache.

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

Ответ 3

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

zpipe < BIGfile.html > BIGfile.htmlz

например.

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

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

Ответ 4

Быстрый способ сжимать контент без прямого взаимодействия с 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 */