构建高性能Web站点(笔记三)

来源:互联网 发布:mac 数据库客户端 编辑:程序博客网 时间:2024/04/29 11:24

第六章 浏览器缓存

    
    浏览器也是Web站点的组成部分。

    Http缓存的目的就是彻底消灭不必要的请求。
    一个原则: 尽可能将Web站点的内容缓存在用户浏览器中,这可在一定程度上减少服务器的计算开销,同时也可以减少重复传输带来的带宽浪费。(传输率越大,占用带宽越大)
    
不同浏览器的缓存地点:
        IE: 在工具/Internet选项/常规/Internet临时文件/设置 中可以看到临时文件夹的位置。
        Firefox: 采用二进制文件的方式来存储和管理缓存文件。它同时使用磁盘和内存来缓存文件。
    浏览器的过期检查:

        服务端的动态内容缓存包括缓存创建、存储、过期检查等,这由服务器端的动态程序来实现。
        浏览器缓存内容在浏览器本地,而内容由Web服务器生成,任何一方不可能独立完成这一系列过程,这就需要Http“缓存协商”。因为浏览器和Web服务器沟通的唯一途径是Http


    缓存协商:

        (1) 基于最后修改时间: (Last-Modified/If-Modified-Since)
            对于动态内容的缓存: 因为浏览器和Web服务器通过Http通信,它并不关心要缓存的内容是否是动态生成的,只要Http头信息中包含响应的缓存协商信息,动态内容同样可以被浏览器缓存,和缓存静态内容没啥区别。 
            如果动态程序没有在Http头信息中指明“上次修改时间”,浏览器再次访问时就不知道这个内容在服务器上的生成时间或最后修改时间,没有过期检查依据,就无法使用缓存,只能从服务器重新得到数据。
            在动态程序中为Http响应增加最后修改时间的标记(响应头中包含: Last-Modified: Fri, 20 Mar 2009 07:54:04 GMT),浏览器再次请求时就可以利用缓存(Http请求中包含: If-Modified-Since: Fri, 20 Mar 2009 07:54:04 GMT,意指我请求的内容在这个时间之后是否有过更新),具体判断是否过期由服务器端动态程序来完成。
            对于静态内容缓存: Web服务器会为静态文件的Http响应自动生成最后修改时间。浏览器再次请求时,带着自己的请求头信息(If-Modified-Since),Web服务器把获得静态文件的最后修改时间和浏览器询问的时间进行对比即可。如果没有过期,Web服务器会返回浏览器 304 Not Modified状态,这意味着浏览器可以使用本地缓存,服务器不在传递响应正文。
       (2) 根据Etag:
 (ETag/If-None-Match)
            Http1.1支持这种缓存方法。Etag没有采用内容的最后修改时间而是采用了一串编码来标记内容。Etag可以用MD5计算出来。它能弥补基于最后修改时间的缓存协商的不足,如对于文件频繁更新但内容没有变化,为实现负载均衡的多服务器系统。


      在使用SSI内容时,由于整个页面由服务器动态生成,Last-Modified标记在不同的Web服务器中有不同的生成方法.
            Apache中,对于SSI内容,默认不附加Last-Modified标记。可通过配置XBitHack来启用Last-Modified。
            Lighttpd中,会将父页面中所有子页面的最后修改时间作为整个页面的Last-Modified时间。


        (3)Expires:

            浏览器看到某个内容有Expires标记后,就不会再向服务器询问,直接访问缓存,这样就彻底消除了Http请求。而以上两种方式都需要与Web服务器交互,由服务器端通知浏览器是否使用浏览器缓存。Expires的过期时间来自于Web服务器的系统时间,Cache-Control: max-age=second 指定缓存过期的相对时间,是相对于浏览器本地时间,second=0表示立即过期。Http响应头中同时含有Expires和Cache-Control时,优先考虑Cache-Control。

 

    常见的请求页面方法:
        Ctrl+F5: 直接向服务器发送请求,不使用缓存协商
        F5: 一般刷新,允许请求中附加必要的缓存协商。Last-Modified或ETag有效,Expires无效
        转到或直接在浏览器地址栏输入URL: Expires有效,这种方式允许浏览器以最少的请求来获取数据。