zoukankan      html  css  js  c++  java
  • php如何控制客户端生成缓存

    php如何控制客户端生成缓存

    一、总结

    一句话总结:用http消息响应头中的Cache-Control来控制客户端缓存,说的是页面本身被客户端缓存,而不是重新生成的其它的非页面缓存

    响应头Cache-Control控制缓存 响应头Expires控制缓存 通过HTTP304:Not_Modified使用缓存 说的是页面本身被客户端缓存

    1、如何使用响应头Cache-Control来控制缓存实例?

    用php来设置响应头
     1 <?php
     2 header("Content-type:text/html;charset=utf-8");
     3 
     4 //用Cache-Control告诉浏览器有效期 5秒
     5 header("Cache-Control:max-age=5");//等同于Cache-Control:public, max-age=5
     6 $curr_time = date('Y-m-d H:i:s');
     7 echo '服务器时间:'.$curr_time;
     8 ?>
     9 <!DOCTYPE html>
    10 <html>
    11 <head>
    12 <meta charset="utf-8">
    13 <title>Cache</title>
    14 </head>
    15 <body>
    16 <br>
    17     Time:<?php  echo $curr_time; ?>
    18 <br>
    19     <a href='cache_sample.php'>刷新时间</a>
    20 </body>
    21 </html>

    二、php控制客户端缓存

    参考:php控制客户端缓存
    https://blog.csdn.net/readyyes/article/details/51321431

    1.关于HTTP消息

    详见: http://www.runoob.com/http/http-messages.html
    http消息中请求头是浏览器要告诉服务器的信息,而响应头是服务器要告诉客户端的信息。这些头的定义是HTTP协议定义好的,客户端和服务器通过解析消息头中信息来完成各自的工作。比如:请求头中Accept-Language:zh-CN,zh;q=0.8 告诉服务器客户端能接收的语言。

    2.响应头Cache-Control控制缓存

    这里写图片描述
    Cache-Control 一个用于定义缓存指令的通用头标。

    缓存策略:
    有用的 Cache-Control响应头信息包括:

    max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。
    s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存
    public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;
    private在服务器设置了private比如:Cache-Control:private, max-age=60的情况下,表示只有用户的浏览器可以缓存private响应,不允许任何中继Web代理对其进行缓存 – 例如,用户浏览器可以缓存包含用户私人信息的HTML网页,但是CDN不能缓存。
    no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);
    no-store — 不做缓存
    must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度。使用缓存的时候每次必须发送请求到服务器校验,比如通过If-Modified-Since或If-None-Match
    proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用,举例:Cache-Control: max-age=3600, must-revalidate
    
    <?php
    header("Content-type:text/html;charset=utf-8");
    
    //用Cache-Control告诉浏览器有效期 5秒
    header("Cache-Control:max-age=5");//等同于Cache-Control:public, max-age=5
    $curr_time = date('Y-m-d H:i:s');
    echo '服务器时间:'.$curr_time;
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Cache</title>
    </head>
    <body>
    <br>
        Time:<?php  echo $curr_time; ?>
    <br>
        <a href='cache_sample.php'>刷新时间</a>
    </body>
    </html>

    这里写图片描述

    3.响应头Expires控制缓存

    <?php
    header("Content-type:text/html;charset=utf-8");
    
    //用Cache-Control告诉浏览器有效期 5秒
    // header("Cache-Control:max-age=5");//等同于Cache-Control:public, max-age=5
    
    //设置10秒的有效期,时间格式是GMT
    //时间是当前服务器时间 + 10秒
    $expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; 
    header("Expires:$expires");
    
    $curr_time = date('Y-m-d H:i:s');
    echo '服务器时间:'.$curr_time;
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Cache</title>
    </head>
    <body>
    <br>
        Time:<?php  echo $curr_time; ?>
    <br>
        <a href='cache_sample.php'>刷新时间</a>
    </body>
    </html>

    这里写图片描述
    expires的弊端是有效期是以服务器时间来设置,如果客户端的时间和服务端时间有一定的时间差,缓存的控制就有问题了,所以还是建议使用Cache-Control好!

    上面的代码如果同时设置了

    header("Cache-Control:max-age=5");
    $expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; 
    //这个设置将无效
    header("Expires:$expires");

    Cache-Control(支持) 和 expires 同时设置有效期,以 Cache-Control设置的有效期为准

    4.通过HTTP 304: Not Modified 使用缓存

    (1)响应头包含 Expires, max-age的话,“打开新窗口”、“地址栏输入url回车”这些浏览器行为不会使浏览器在Expires, max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是”刷新’”或”F5” 例外
    (2)访问服务器,根据服务器响应来获取内容。这种情况发生在设置了Cache-Control:no-cache 是否使用缓存必须要通过服务器验证,或者是设置了 Expires,max-age但浏览器行为是“刷新”或“F5”时候。’Last-Modified’、’ETag’、’must-revalidate’ 等有些特殊,不直接受浏览器行为影响,它们必须访问服务器后,再由服务器判断是直接发送新的资源,还是发送一个304 Not Modfied让浏览器使用缓存中的资源。

    注意: CTRL+ F5是强制刷新。

    这里写图片描述
    ETag全称Entity Tag,用来标识一个资源。在具体的实现中,ETag可以是资源的hash值,也可以是一个内部维护的版本号。但不管怎样,ETag应该能反映出资源内容的变化,这是Http缓存可以正常工作的基础。Last-Modified的原理其实和ETag差不多,Last-Modified通过时间来标识资源。通过这样的方式可以不必每次都获取全部的资源达到更新的目的,能极大的节省服务器的开销,更有利于搜素引擎的抓取。

    <?php
    header("Content-type:text/html;charset=utf-8");
    
    header("Cache-Control:no-cache");
    //响应头Last-Modified
    $lastmodified = filemtime('./cache.php');
    $lastmodifiedGMT = gmdate('D, d M Y H:i:s',$lastmodified). ' GMT';
    header("Last-Modified:$lastmodifiedGMT");
    
    //响应头ETag
    $etag = md5_file('./cache.php');
    header("ETag:$etag");
    
    
    
    
    if (@$_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmodifiedGMT ||
        @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
            header("HTTP/1.1 304 Not Modified");
            exit;
        }
    
    //返回304后,下面的内容不会向浏览器返回,而浏览器会使用之前的缓存   
    $curr_time = date('Y-m-d H:i:s');
    echo '服务器时间:'.$curr_time;
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Cache</title>
    </head>
    <body>
    <br>
        Time:<?php  echo $curr_time; ?>
    <br>
        <a href='cache_sample.php'>刷新时间</a>
    </body>
    </html>

    这里写图片描述

    引用:
    [1]写给后端程序员的HTTP缓存原理介绍
    [2]面向站长和网站管理员的Web缓存加速指南[翻译]
    [3]缓存Cache详解

     
  • 相关阅读:
    设计模式-简单工厂模式、工厂模式、抽象工厂模式-(创建型模式)
    设计模式-类间关系
    设计模式-六大基本原则
    设计模式-总起
    [转载]常见的移动端H5页面开发遇到的坑和解决办法
    [转载]Angular4 组件通讯方法大全
    【angular5项目积累总结】文件下载
    【转载】Vue 2.x 实战之后台管理系统开发(二)
    [转载]Vue 2.x 实战之后台管理系统开发(一)
    WordPress翻译中 __()、_e()、_x、_ex 和 _n 的用法及区别
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10655507.html
Copyright © 2011-2022 走看看