手动替代mod_deflate

时间:2010-03-08 17:51:19

标签: apache compression module

假设我没有将mod_deflate编译成apache,我现在不想重新编译。手动方法的缺点是什么,例如:类似的东西:

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

(注意:我知道RewriteCond的具体内容需要调整稍微

3 个答案:

答案 0 :(得分:3)

另一种选择是将所有内容转发到PHP脚本,该脚本可以动态gzips和缓存所有内容。在每个请求中,它会将时间戳与缓存版本进行比较,如果它比源文件更新则返回。使用PHP,您还可以覆盖HTTP标头,因此它被正确对待,就好像它本身就是GZIPed一样。

这样的事情可能适合你:

的.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 :(得分:1)

手动和自动方法之间似乎没有太大的性能差异。我做了一些自动和手动压缩的apache-bench运行,两次都在4%之内。

明显的缺点是你必须在部署之前手动压缩CSS文件。您可能想要确定的另一件事是您的配置正确。当我尝试使用手动方法时,我无法自动解码css,ab报告也列出了压缩数据大小而不是自动压缩的未压缩数据。

答案 2 :(得分:1)

你也可以使用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(),这显然会对性能产生很小的影响。< / p>