Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970232
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: PHP

2013-03-26 17:41:21

缓存的主要作用是防止用户频繁刷新网站页面,导致服务器数据库负担,既要保证信息更新的及时性,也要保证缓存能被充分利用。http协议里控制浏览器缓存的头有三个Cache-Control,Expires,Last-Modified,在PHP下控制请求页面的浏览器缓存主要是利用php的 header()函数进行设置的。下面来了解一下这三个http协议里面控制缓存头的含义以及如何使用php设置这三种头标的方式吧!
 
(1)Cache-Control:即缓存控制,指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。 请求时的缓存指令有 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等,响应消息中的指令有 public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。各个消息中的部分指令含义如下:
 
Public:指示响应可被任何缓存区缓存。 
Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 
no-cache:指示请求或响应消息不能缓存 
no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 
max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 
min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 
max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
 
注意:Cache-Control 头标是在HTTP1.1里添加的,相对于其他几种方式能够实现更细致的缓存控制。
 
php设置 Cache_Control 头标示例代码如下:
 
PHP Code复制内容到剪贴板
  1. header('Cache-Control: max-age=3600*24');//缓存1天,表示最大生存期是1天,超过1天浏览器必须去服务器重新读取,这个时间是从用户第一次读取页面时开始计时的  
(2)Expires:缓存过期的绝对时间(格林威治标准时间)。如果过了它指定的那个时间点,浏览器就不认缓存了,就会去服务器重新请求一份最新的。
 
php设置 Expires 头标示例代码如下:
 
PHP Code复制内容到剪贴板
  1. header('Expires: Mon, 29 Jan 2007 08:56:01 GMT');//指定过期时间,注意这里使用的是格林威治标准时间  
 
获取格林威治标准时间可使用函数gmdate,具体用法可参考相关文档。
 
(3)Last-Modified:文档的最后修改时间。它的用法就是:
 
1:如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少。
 
2:如果是php动态文件,客户端发上比对时间,php会判断是否修改,如果修改时间相同,就只会返回1024字节,至于为什么返回1024不得而知,如果你的php生成的文件非常大,它也只返回1024,所以比较省带宽,客户端会根据服务器端发过来的修改时间自动从缓存文件里显示。
 
注意:如果没有设置Last-Modified头,只设置了Cache-Control和Expires也是可以起作用的,但每次请求要返回真实的文件字节数,而不是1024
 
php设置 Last-Modified 头标示例代码如下:
 
PHP Code复制内容到剪贴板
  1. header('Last-Modified: '.gmdate('D, d M Y 01:01:01',$time).' GMT');//使用的是格林尼治时间,$time是指文件添加时候的时间戳  
 
下面发一个完整的通过php控制请求页面浏览器缓存的示例:
PHP Code复制内容到剪贴板
  1. echo '这是一个缓存测试!';  
  2. $time=time();  
  3. $interval=3600*12;//12小时  
  4. header('Last-Modified: '.gmdate('r',$time));  
  5. header('Expires: '.gmdate('r',($time+$interval)));  
  6. header('Cache-Control: max-age='.$interval);  
 
另外分析一下刷新,转到以及强制刷新的区别,浏览器上有刷新和转到按键,有的浏览器支持用ctrl+F5强制刷新页面,它们的区别是什么?恐怕知道的人不多吧!其实这三种动作完全可以用上面这三种头标进行解释。
 
转到:用户点击链接就是转到,它完全使用缓存机制,如果有Last-Modified那么不会和服务器通讯,用抓包工具可以查看到发送字节是0byte,如果缓存过期,那么它会执行F5刷新的动作。
 
刷新(F5):这种刷新也是根据缓存是否有Last-Modified来决定,如果有会转入304或1024(php),如果没有最后更新时间那么去服务器读取,返回真实文档大小。
 
强制刷新(ctrl+F5):完全抛弃缓存机制,去服务器读取最新文档,向服务器发送的header如:Cache-Control: no-cache 指令。
阅读(697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~