方法gzip文件,如CSS,Javascript一次,并保存它们服务于客户端,而不是每次请求时处理和gzip

时间:2010-08-13 15:39:29

标签: php optimization web compression gzip

我相信这将是一个更加CPU友好的方法,它可以用PHP实现吗?而不是为每个请求gzipping内容,我压缩文件一次,而不是服务那些=)。

2 个答案:

答案 0 :(得分:3)

是的,这对Apache很容易。

并排存储未压缩和压缩的文件。 E.g:

\-htdocs
  |-index.php
  |-javascript.js
  \-javascript.js.gz

在Apache中启用内容协商。使用:

Options +MultiViews

现在当请求“/ javascript”时,如果客户端声明它接受它(通过Accept-encoding),Apache将提供gzip压缩版本。

两个HTTP请求的示例(省略了一些标头):

客户声称接受gzip

GET /EP/Exames/2006-2007/exame2B HTTP/1.1
Host: lebm.geleia.net
Accept-Encoding: gzip, identity

HTTP/1.1 200 OK
Date: Fri, 13 Aug 2010 16:22:59 GMT
Content-Location: exame2B.nb.gz
Vary: negotiate,accept-encoding
TCN: choice
Last-Modified: Sun, 04 Feb 2007 15:33:53 GMT
ETag: "0-c9d-428a84de03a40;48db6d490abee"
Accept-Ranges: bytes
Content-Length: 3229
Content-Type: application/mathematica
Content-Encoding: gzip

‹áüÅE
(response continues)

客户未声明接受gzip

GET /EP/Exames/2006-2007/exame2B HTTP/1.1
Host: lebm.geleia.net
Accept-Encoding: identity

HTTP/1.1 200 OK
Date: Fri, 13 Aug 2010 16:23:14 GMT
Content-Location: exame2B.nb
Vary: negotiate,accept-encoding
TCN: choice
Last-Modified: Sun, 04 Feb 2007 15:33:53 GMT
ETag: "0-257f-428a84de03a40;48db6d490abee"
Accept-Ranges: bytes
Content-Length: 9599
Content-Type: application/mathematica

(************** Content-type: application/mathematica **************
CreatedBy='Mathematica 5.2'
(response continues)

在此处查看更完整的版本http://pastebin.com/TAwxpngX

答案 1 :(得分:1)

是的,这是节省带宽和连接的明智方法。 (如果需要,你可以在Apache中启用gzip压缩,但是当你保存连接时,它仍然值得这样做。)

实质上,使用PHP函数检查浏览器是否支持gzip压缩。 (如果不是,你需要按照正常情况获取JavaScript / CSS。)如果确实如此,你可以简单地将JavaScript或CSS源位置指向一个PHP脚本,该脚本负责:

  1. 检查是否有压缩版本。 (如果存在,只需输出现有的“磁盘上”。)

  2. 创建所需文件的压缩版本。

  3. 您可能还想从定义/顶级配置启用/禁用此功能(出于测试目的等)。作为建议,您可以将所需的CSS / JavaScript文件路径存储在一组数组中,这可能是用作创建缓存文件的基础或以传统方式包含文件作为后备。

    我过去在这些行中编写了一个解决方案,它根据所需文件名的哈希创建了一个文件。因此,如果包含其他/附加文件,则会自动重建缓存。 (它还在'n'小时后重新构建了缓存,但这只是为了在文件名没有改变的情况下保持新鲜,但内容确实如此。)