如何确定我的文件是从缓存中提供的?

时间:2016-01-17 05:06:53

标签: javascript apache performance caching google-chrome-devtools

我已将此代码(如下所示)设置到我的Apache服务器(CentOS)中的虚拟主机配置中,目的是确保用户只下载一次这些大型静态资产。

值得注意的是,我有一个大的(捆绑的,缩小的)javascript,css等。

<FilesMatch "\.(ico|pdf|flv|jpe?g|png|gif|js|css|swf|mp3|mp4|webm)$">
    ExpiresActive On
    ExpiresDefault "access plus 1 year"
</FilesMatch>

问题是,我无法判断它们是否是从缓存中提供的。即使没有勾选禁用缓存复选框,如果我使用Chrome开发工具检查其响应标头(在网络选项卡中),我确实会看到未来一年设置过期标头,但是,我也看到报告的大小为355kb,加载时间超过1秒!

有没有比我更多Apache / Dev Tools经验的人知道这里发生了什么?我相信报告的时间或过期标题吗?我怎么能确定我的资产是否正确地从缓存中提供?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

缓存有两个部分,经常会混淆:

  1. 项目被添加到缓存中,因此如果在缓存时间内使用,可以使用而不用返回服务器。这样可以节省网络请求,这是缓存的主要好处(参见why Page Weight Doesn't Matter but latency does)。

  2. 如果事实证明缓存版本在与服务器进行快速双重检查后仍然有效(将返回304响应),则可以在缓存时间缓存后提供项目说“你的缓存版本仍然有效 - 将其缓存到另一位”)。这适用于较大的资产(图像,视频),但对于较小的资产(html和css),重新检查资产仍然有效的网络请求可能几乎与再次下载文件的请求一样长。因此,这种缓存有较小的收益。

  3. 要在Chrome开放式开发人员工具中测试这两种情况,您必须确保未在“网络”标签中勾选“禁用缓存”。默认情况下,当开发人员工具打开时,您可能正在开发并希望查看最新版本。

    然后您需要注意,有三种方法可以请求影响缓存的页面:

    1. 您浏览到某个页面。如果没有在缓存中获得它,您将看到状态200和大小。如果您之前已经访问过,并且在缓存中有一个有效版本,那么您仍然会看到200,但“(来自缓存)”将出现在“大小”列中。最后,如果在缓存中但已过期,那么在查看服务器后,如果缓存版本实际上仍是最新版本,则可能会看到304。

    2. 按F5或重新加载页面。这是用户对双重检查内容的明确请求。所以甚至如果它仍然在缓存时间内,浏览器将进行双重检查,最多只能获得304响应。在测试时很容易误解这个。

    3. Ctrl + F5键。这基本上说“删除缓存并重新开始”。即使在缓存中且有效,也会再次下载项目,因此您应该获得200个响应,没有“(来自缓存)”且没有304.

    4. 我对您的网站进行了仔细检查,可以看到css和jpeg已正确添加到缓存中并从缓存中提供。另外按F5显示304s如预期。所以看起来都很好。

      还有一些需要注意的事项:

      • 浏览器&amp;服务器决定缓存版本是否仍然有效,是通过两种方法之一,Etags经常用于此。但由于long standing bug in Apache,Etags和GZip导致Apache出现问题。在这里查看我的帖子:https://www.tunetheweb.com/performance/http-performance-headers/etag/。我关闭了ETags并在你的服务器上打开Gzip(不知道你为什么要关闭gzip,但绝对值得开启)。

      • 您的HTML页面未被缓存。这通常用于缓存破坏技术,但我认为这是错失的机会。浏览网站时,获取即时响应非常好,而不是等待HTML再次下载,即使它使用的资产是从缓存中提供的。我有blog post on caching进一步讨论。

      • 浏览器在某些情况下可以忽略缓存(例如,如果dev工具打开时禁用缓存,或缓存已填满或关闭),那么你不能依赖缓存,但如果设置正确,它可以帮助你的用户和服务器都很多。

      • 缓存比您想象的要小得多(请再次参阅why Page Weight Doesn't Matter but latency does链接)。所以再次假设最坏的情况,并且它不在缓存中。

      • 您的服务器上禁用了Keep-Alives,这是一个巨大的性能影响。请在此处查看waterfall graph here,了解这对您造成的影响。每个资源请求(无论是初始请求还是检查缓存304请求)都需要建立新连接(橙色),还需要新的SSL协商(紫色),这些是请求的大比例,如果没有那些响应将会相当大更快。默认情况下,Keep-Alives在Apache中处于启用状态,所以您是否明确禁用了它?如果是这样,为什么?请参阅my blog post to see where to check the Keep-Alive settings in Apache

      顺便说一句。在上一节链接到我自己的许多博客文章并且如果它看起来像垃圾邮件,我很抱歉,但我对这一切有兴趣(因此我为什么在博客上发布),并试图在这里回答这个问题并且只是包含了更多信息的链接。所以希望这不会冒犯任何人。