代码之家  ›  专栏  ›  技术社区  ›  Bobby Jack

手动替换mod_deflate

  •  4
  • Bobby Jack  · 技术社区  · 15 年前

    假设我没有将mod_deflate编译到apache中,并且我现在不想重新编译。手动方法的缺点是什么,例如:

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

    (注意:我知道rewritecond的细节需要调整) 轻微地 )

    3 回复  |  直到 15 年前
        1
  •  3
  •   Ivan Peevski    15 年前

    另一种选择是将所有内容转发到php脚本,该脚本可以动态地对所有内容进行gzip和缓存。在每次请求时,它都会将时间戳与缓存的版本进行比较,如果时间戳比源文件新,则返回时间戳。使用php,您还可以覆盖http头部,因此它被正确地视为是由apache自己gziped的。

    这样的事情可能对你有帮助:

    HTAccess

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

    CpH.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的写权限来生成缓存版本。您可以稍微修改脚本,将缓存的文件存储在不同的位置。

    这还没有经过广泛的测试,可能需要根据您的需要稍加修改,但这个想法已经足够了,应该足以让您开始。

        2
  •  1
  •   code_martial    15 年前

    手动和自动方法之间的性能差异似乎不大。我用自动和手动压缩做了一些apache测试,两次都在4%以内。

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

        3
  •  1
  •   David Wolever    15 年前

    你也可以用 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() 对于每个请求,这显然对性能影响很小。