php控制客户端缓存

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详解

时间: 2024-07-31 15:33:43

php控制客户端缓存的相关文章

Cookie客户端缓存.Session.Application

Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器的请求次数,从而减少用户等待从服务端获取数据的时间. 二是网络状态不佳时仍可以显示离线数据. 2.本地存储 用chrome浏览器打开一个网页,F12进入开发者模式,点击Application,我们可以看到: 以上的Local Stroage . Session Stroag

asp.net 服务器端缓存与客户端缓存 [转]

介绍: 在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理.每个人都会用不同的方法去解决如何在IE在管理数据.有的会提到用状态管 理,有的提到的cache管理,这里我比较喜欢cache管理,因为本人比较喜“cache”这个词.但是状态管理和cache管理这两个在概念和意义上 是不同的,下面就让我们来讨论下两都在各个方面的不同之处. 虽然cache管理并不存在于Windows程序,但在web环境中已经得到巨大的应用.自从HTTP变成无协议以来,在WEB上要想分辨两个不同请求变

Android客户端缓存机制(文字缓存跟多媒体文件缓存)

Android客户端缓存机制(文字缓存和多媒体文件缓存) 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 缓存文件保存策略: 1.       文字缓存: 文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域. 根据两者的更新频率区分它们的过期时间. 更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到

客户端缓存机制

一.简介 客户端缓存机制不仅可以减轻服务器端的压力,同时也能让用户在网速较慢的情况下获取良好的用户体验.所以构建一个优秀的APP,缓存是很重要的一个环节. 二.处理方案 客户端从服务器获取最新数据,假如是20条,同时将数据缓存到本地,当加载下一页数据时不仅将数据添加到内存中,还要同步到缓存中.这样以此类推,内存中的数据和缓存的数据保持一致. 当用户重新下拉刷新界面时,会出现两种情况: 一种是此时用户数据更改小于一页,第二种是用户数据更改大于一页. 第一种情况比较简单,数据变动小于一页,说明刷新返

005-优化web请求一-gzip压缩、http缓存控制和缓存校验[Pragma、Expires、Cache-Control、max-age、Last-Modified、用户刷新访问、避免过度304]

优化Web应用的典型技术:缓存控制头信息.Gzip.应用缓存.ETag.反应型技术[异步方法调用和WebSocket] 一.模板缓存 spring.thymeleaf.cache=true spring.messages.cache-duration= 二.Gzip压缩 Gzip是一种能够被浏览器直接理解的压缩算法.服务器会提供压缩响应,会耗一些cpu,但是减少带宽 GZIP压缩是一个经常被用到的WEB性能优化的技巧,它主要是对页面代码,CSS,Javascript,PHP等文件进行压缩,而且在

浏览器以及对应的客户端缓存

通过这张图,我们晓得缓存分为以下几部分,客户端缓存,CDN缓存,反向代理缓存以及对应的本地缓存,分布式缓存等 前面我有介绍过 CND缓存 和 反向代理缓存,今天我们主要介绍一下浏览器缓存以及对应的本地缓存 1:客户端缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问,想想现在的大型网站,随便一个页面都是一两百个请求,每天 pv 都是亿级别,如果没有缓存,用户体验会急剧下降.同时服务器压力和网络带宽都面临严重的考验. 2:客户端缓存主要是HTTP协议定义的缓存机制(如 Expires, Ca

nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存

一.Nginx优化目的 标准情况下,软件默认的参数都是对安装软件的硬件标准来设置的,目前我们服务?的硬件资源远远大于要求的标准,所以为了让服务?性能更加出众,充分利用服务?的硬件资源,我们一般需要优化APP的并发数来提升服务器?的性能. 二.工作进程优化 1) worker_processes worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_pro

servletResponse 控制浏览器缓存

//当访问一些资源文件时,我们希望,访问一次后,资源文件能够在缓存在浏览器中,当我们再次访问该资源时 //直接从缓存中去取,这样可以减少服务器的压力 package response; import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import ja

HTTP协议控制浏览器缓存HTTP协议控制浏览器缓存

HTTP协议控制浏览器缓存 2015.01.25 SilenceHurts 当我们浏览网站的图片时,按下F12监控,很容易就发现,当我们第一次浏览该图片时,浏览器返回的代码是200,即请求正常,此时,不懂任何东西,我们按下F5刷新页面,注意,我们会发现监控下的代码返回不再是200,而是现实304 Not Modifid,即未修改. 原因:第一次我们访问图片时,是正常的,而第二次访问时现实304,因为此时我们浏览器发现页面未发生更改,此时使用的是本地的缓存,而并非服务器返回的代码,加快了速度. 设