【问题标题】:How to pre-compress very large html files如何预压缩非常大的 html 文件
【发布时间】:2011-03-04 10:03:09
【问题描述】:

我需要使用 gzip 或 deflate 预压缩一些非常大的 html/xml/json 文件(大数据转储)。我从不想提供未压缩的文件。它们是如此之大且重复,以至于压缩可能会很好地工作,虽然一些较旧的浏览器不支持解压缩,但我的典型客户不会使用它们(尽管如果我能生成某种“嘿,你需要升级浏览器的消息)

我自动生成文件,我可以轻松地生成 .htaccess 文件以配合每种文件类型。基本上我想要的是mod_gunzip 的版本。因为文件很大,而且我会重复为它们提供服务,所以我需要一种方法,可以让我在命令行上压缩一次,非常好。

我在这个网站和其他网站上找到了一些关于如何使用 gzip 执行此操作的信息,但我想知道是否有人可以指导我如何使用 deflate 执行此操作。完整答案的加分点包括我的 .htaccess 文件应该是什么样子,以及我应该使用 (GNU/Linux) 来获得最佳压缩的命令行代码。答案的超级奖励积分还解决了如何向不兼容的浏览器发送“抱歉没有文件”消息。

如果我们可以创建一个“预压缩”标签来涵盖这样的问题,那就太好了。

-FT

【问题讨论】:

  • 您可能会从 serverfault.com 获得更好的响应
  • 看起来像 stackoverflow.com/questions/75482/… 的副本
  • 这很有帮助,但只讨论 gzip 而不是 deflate 预压缩。它也在 Rails 环境中,而不是 php 环境中(尽管仍然是 apache)。帖子中的相似之处支持预压缩标签
  • @ftrotter:创建标签就像使用新标签(重新)标记问题一样简单。
  • 这个问题不是更适合Server Fault吗?

标签: linux apache compression gzip deflate


【解决方案1】:

在不直接处理 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 */

【讨论】:

  • 这是在运行 gzip。我但是该文件已经以 html/json/xml/whatever 的形式存在于磁盘上。我想我可以像这样使用 php 来生成正确的标题,然后回显文件(或等效文件),但是没有办法在 apache 中做到这一点吗?
【解决方案2】:

编辑:找到AddEncoding in 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 可以压缩和缓存(压缩后的)文件。

【讨论】:

  • 如果你能包含 mime 类型代码我会接受这个答案,看起来没有人会给我一个完整的答案,包括 deflate 选项......
  • 那也可以是:&lt;FilesMatch "\.html\.z$"&gt;&lt;IfModule mod_headers.c&gt;Header set Content-Encoding: deflate&lt;/IfModule&gt;&lt;/FilesMatch&gt;
【解决方案3】:

对于命令行,编译zlib的zpipe:http://www.zlib.net/zpipe.c然后

zpipe < BIGfile.html > BIGfile.htmlz

例如。

然后使用 Zash 的示例,设置一个过滤器来更改标题。这应该为您提供 RAW 压缩文件,现代浏览器 probably support

要了解另一种压缩文件的方法,请查看使用带有 zlib (-z) 或 PKWare zip (-K) 压缩选项的 pigz。通过设置 Content-Encoding 测试这些工作是否正常。

【讨论】:

  • 哦,把 zpipe 中的 Z_DEFAULT_COMPRESSION 改成 Z_BEST_COMPRESSION。
  • 这是做“deflate”压缩还是只做 gzip?
  • zpipe 至少会放气。尝试为 pigz 压缩设置一个测试文件,老实说,我现在没有测试环境来测试这个。 Pigz 也将通过利用多个核心更快地压缩。哇。
【解决方案4】:

如果我是你,我会考虑内置文件系统压缩,而不是在 apache 层这样做。

在 solaris zfs 具有透明压缩,使用 zfs compress 仅压缩文件系统。 类似地,windows 可以压缩文件夹,apache 将提供内容,而不会注意到它是在磁盘上压缩的。 Linux 也有可以进行透明压缩的文件系统。

【讨论】:

  • 很好的评论。 Linux 上有什么文件系统以及在云实例中执行此操作的任何建议?如何正确设置标题(以便客户端可以理解内容?)
  • 在linux上没那么优雅,但是有fuse模块可以做透明压缩/解压。像这个:miio.net/wordpress/projects/fusecompress 你不必对 apache 中的标题做任何事情,因为就 apache 而言,它们是普通文件。 :-)
  • 我看不出这个答案如何解决问题。听起来好像 ftrotter 想要预压缩文件以节省请求时的处理开销。如果使用透明文件系统压缩,Apache 仍然需要在请求时重新压缩。
  • 我想我一定是误读了这个问题。我认为目的是为了节省机器上的空间,但你是对的,在重新阅读我理解的问题之后。
猜你喜欢
  • 2022-07-06
  • 2013-05-28
  • 1970-01-01
  • 2010-09-25
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
相关资源
最近更新 更多