Ручная альтернатива mod_deflate - PullRequest
4 голосов
/ 08 марта 2010

Скажем, у меня нет mod_deflate, скомпилированного в apache, и сейчас я не хочу перекомпилировать. Каковы недостатки ручного подхода, например, что-то вроде:

AddEncoding x-gzip .gz
RewriteCond %{HTTP_ACCEPT_ENCODING} gzip
RewriteRule ^/css/styles.css$ /css/styles.css.gz

(Примечание: я знаю, что особенности этого RewriteCond должны быть изменены слегка )

Ответы [ 3 ]

3 голосов
/ 15 марта 2010

Другой альтернативой было бы перенаправить все в скрипт PHP, который gzips и кэширует все на лету. При каждом запросе он сравнивает метки времени с кэшированной версией и возвращает ее, если она новее исходного файла. С помощью PHP вы также можете перезаписать заголовки HTTP, поэтому он обрабатывается должным образом, как если бы он был GZIPed самим Apache.

Что-то подобное может сделать работу за вас:

.htaccess

RewriteEngine On
RewriteRule ^(css/styles.css)$ cache.php?file=$1 [L]

cache.php:

<?php
// Convert path to a local file path (may need to be tweaked)
cache($_GET['file']);

// Return cached or raw file (autodetect)
function cache($file)
{
  // Regenerate cache if the source file is newer
  if (!is_file($file.'.gz') or filemtime($file.'.gz') < filemtime($file)) {
    write_cache($file);
  }

  // If the client supports GZIP, send compressed data
  if (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) and strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
    header('Content-Encoding: gzip');
    readfile($file.'.gz');
  } else { // Fallback to static file
    readfile($file);
  }
  exit;
}

// Saved GZIPed version of the file
function write_cache($file)
{
  copy($file, 'compress.zlib://'.$file.'.gz');
}

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

Это не было тщательно протестировано, и, возможно, его нужно немного изменить для ваших нужд, но идея в том, что его достаточно, чтобы начать работу.

1 голос
/ 17 марта 2010

Вы также можете использовать mod_ext_filter и передавать данные через gzip. Фактически это один из примеров:

# mod_ext_filter directive to define the external filter
ExtFilterDefine gzip mode=output cmd=/bin/gzip

<Location /gzipped>
# core directive to cause the gzip filter to be
# run on output
SetOutputFilter gzip

# mod_header directive to add
# "Content-Encoding: gzip" header field
Header set Content-Encoding gzip
</Location>

Преимущество этого в том, что это действительно очень просто ... Недостатком является то, что при каждом запросе будут добавляться дополнительные fork() и exec(), что, очевидно, окажет небольшое влияние на производительность.

1 голос
/ 11 марта 2010

Кажется, нет большой разницы в производительности между ручным и автоматическим подходами. Я выполнил несколько тестов apache-bench с автоматическим и ручным сжатием, и оба раза были в пределах 4% друг от друга.

Очевидным недостатком является то, что вам придется вручную сжимать файлы CSS перед развертыванием. Еще одна вещь, которую вы можете быть уверены, это то, что вы правильно настроили конфигурацию. Я не смог заставить wget автоматически декодировать CSS, когда попробовал ручной подход, и в отчетах ab также указывался размер сжатых данных вместо несжатых, как при автоматическом сжатии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...