如何测试缓存和缓存破坏?

7

在 PHP 中,我试图借鉴 Rails 的做法(参见“使用资产时间戳” 这里):

默认情况下,Rails 将资产的时间戳附加到所有资产路径中。这使您可以为资产设置远期缓存过期日期,但仍然能够通过简单更新文件(因此更新时间戳,然后更新 URL,因为时间戳是其中一部分,从而破坏缓存)即可立即使其失效。

您需要使用的 Web 服务器负责设置缓存资产的远期到期日期,以利用此功能。以下是 Apache 的示例:

  # Asset Expiration
  ExpiresActive On
  <FilesMatch "\.(ico|gif|jpe?g|png|js|css)$">
    ExpiresDefault "access plus 1 year"
  </FilesMatch>

如果您查看Rails页面的源代码,您将会看到它们是什么意思:样式表的路径可能是"/stylesheets/scaffold.css?1268228124",其中末尾的数字是文件上次更新的时间戳。
所以它应该像这样工作:
  1. 浏览器说“给我这个页面”
  2. 服务器说“好的,并且顺便说一下,叫做scaffold.css?1268228124的这个样式表可以缓存一年-它不会改变。”
  3. 在重新加载时,浏览器说“我不再请求那个CSS文件,因为我的本地副本仍然有效。”
  4. 一个月后,您编辑并保存文件,这会更改时间戳,这意味着文件不再叫做scaffold.css?1268228124,因为数字已经改变。
  5. 当浏览器看到这个时,它说“我从未见过那个文件!请给我一份拷贝。”缓存被“破坏”了。
我认为这很棒。因此,我编写了一个函数,生成带有时间戳附加到文件名的样式表和JavaScript标记,并使用上述语句配置了Apache。
现在:如何判断缓存和缓存破解是否有效?我正在使用两个Firebug插件检查我的页面:Yslow和Google Page Speed。两者似乎都表明我的文件已被缓存:“在Yslow中添加过期标头”和“在Page Speed中利用浏览器缓存”都已被勾选。但是,当我查看Page Speed活动时,我看到了很多请求和等待,没有“缓存命中”。如果我更改我的样式表并重新加载,我会立即看到更改。但我不知道这是因为浏览器从未缓存还是因为缓存已被破坏。我怎么知道呢?更新:它起作用了!如果有人感兴趣,我刚刚写了一篇博客文章解释细节
1个回答

4
firebug 中,您会看到缓存页面的 304 Not Modified
请检查您是否在 Apache 中实施了这些措施 - 我发现您需要一些设置来适应所有浏览器。

好的!好的,我现在明白了——它在网络面板中。对于所有已缓存的内容,我得到了“304未修改”的响应。如果我对文件进行微小的更改,在下一次重新加载时,我会看到它的状态变为“200 OK”。再次重新加载后,它又回到了“304未修改”的状态。 - Nathan Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接