2010-07-14 152 views
0

为了减少http请求,以及使js/css文件更容易推出,我已经安装了我的php应用程序来连接js和css文件。使用每个文件的2个字母代码(例如home.js代码=“AA”)将所有包含的文件按顺序合并为一个大文件。要生成名称,我按照它们加载的顺序组合所有代码,添加下划线,然后添加时间戳(例如“AABACE_12345678.js”)。然后在他们的服务目录中,我在htaccess中使用apache指令来解析php文件(唱sethandler),这样我就可以控制标题,并且返回301标题不变。在JS/CSS缓存

不幸的是,这是行不通的......我用萤火虫的Net面板和liveHTTPHeaders测试了它的废话。该页面每次都会加载该文件,即使它应该放在缓存中。这里的响应头文件的回报的一个示例:

Date    Wed, 14 Jul 2010 17:00:28 GMT 
Cache-Control  private 
Content-Encoding gzip 
Etag    "4b4a6d50f9acf924b9dce14e415f5c78" 
Expires    Wed, 28 Jul 2010 17:00:28 GMT 
Vary    Accept-Encoding 
X-Powered-By  PHP/5.2.6 
Last-Modified  Wed, 14 Jul 2010 16:59:35 GMT 
Content-Length  39305 
Content-Type  text/css 

注意:我省略了一些非高速缓存相关的头,喜欢的keepAlive,服务器等

我也应该注意到,我m有条件地压缩内容,因此是私有缓存控制头。我在这里错过了什么?内容应该由于过期标题而被缓存。我从文件名+时间戳的md5生成etag,以便从不改变文件。上次修改从未改变,过期时间永远不会改变....

[编辑]

所以进一步检查之后,我的css文件越来越缓存,但我的JavaScript是没有的。如果我有两个文件,IDENTICAL缓存标题(etag,expires,last-modified,cache-control),但唯一不同的是内容类型(一个“text/css”一个“text/javascript”),只有css正在缓存...令人沮丧的

+0

我假设你的意思是最后一个filemtime()时间戳,而不是当前时间戳? – Wrikken 2010-07-14 17:14:50

+0

@Wrikken - 正确。每次包含的js/css文件中的一个被更新时,它都会创建一个新名称,并将当前时间戳作为名称的一部分。但是用于生成Etag/Last-modified头的时间戳等于filetime()返回的内容。 – eCaroth 2010-07-14 18:32:34

+0

好的,但只是要特别确定:所需文件的时间戳保持不变,并且您在指示要加载的文件时自动记住时间戳?如果是这样,你有我们测试的网址吗? YOu不会是'我正在开发这个网站,因此不要在个人浏览器中缓存任何'个人设置'的第一个被挫败的东西。 – Wrikken 2010-07-14 23:24:56

回答

0

这是一个有趣的练习,但在我看来,从长远来看,如果您的网站开始越来越受到重视,服务器端组合和重命名文件可能会增加自己的开销,可能是比只加载一些额外的文件更糟糕。我有兴趣查看一些统计数据,以了解它对服务器负载有什么影响。

我为国际银行做了一些重新设计工作 - 我的团队重新设计了超过1,000个主要信用卡网站,其中一些网站每天获得超过100万个唯一身份(相当严重的流量)有一个人完全分配给标准和优化。最后,我们做了诸如缩小js文件之类的基础知识,并且出于您想要克服的原因而广泛使用sprite。但是,通过分析您所说的级别的影响,确定在人工时间内的成本将显着超过节省的带宽成本中的收益 - 即使在5k节省量/文件每天等于5gb带宽的情况下也是如此。

你有做旧事的“旧办法”的副本吗?一旦你得到这个舔,一个比较旧的和新的分析将是很酷的。

+0

带宽不是唯一的考虑因素。合并文件和创建精灵可以减少传输次数,这可以显着减少显示页面的延迟。 – 2010-07-14 19:59:05

+0

这个文件只生成一次,然后在每次需要文件时提供。 JS和CSS文件已经被缩小,它们只是被连接起来以减少http请求,就像Chris Arguin所说。这一切都很好,我在这里没有问题。但是这些文件并没有被缓存,这是我的问题。 – eCaroth 2010-07-14 20:12:15