Apache环境下PHP利用HTTP缓存协议原理解析及应用分析


Posted in PHP onFebruary 16, 2010

对于静态页面还有Etag。

一、先来看第一种情况:apache 静态页面

apache发送给客户端的静态页面一般包含Last-Modified和Etag,这两个标签的值来自静态文件的修改时间和inode。

下面是截取得apache返回客户端的头

XML/HTML代码

Last-Modified: Fri, 26 Jan 2007 01:53:34 GMT 
ETag: "3f9f640-318-cb9f8380"

搜索引擎之所以喜欢静态文件是因为有这两个标识,可以判断文件是否更新过

二、PHP等动态页面

由于php是动态生成的,它的内容是不能根据php程序的时间来确定最后修改日期,所以默认php返回客户端的时候补包含任何缓存控制,要想利用好缓存就必须了解缓存机制,和理减少b,s的交互,缩减带宽流量,减轻服务器负担...好处多多。

三、缓存控制的具体含义

先解释一下本人经过测试理解的这几个标签的含义

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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

php用法:

在输出之前用header(),(如果使用ob_start()可以将header放在程序任意地方)

PHP代码

header('Cache-Control: max-age=8');

max-age=8表示最大生存期8秒,超过8秒浏览器必须去服务器重新读取,这个时间是以用户的读取页面开始计时的,而Expires是绝对时间。

Expires:缓存过期的绝对时间,如果过了它指定的那个时间点,浏览器就不认缓存了,要去服务器重新请求一份最新的。

Last-Modified:文档的最后修改时间,它的妙用就是:1

如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少,(高级版本还会增加比较Etag来确定文件是否变化)

2 php动态文件:

客户端发上比对时间,php会判断是否修改,如果修改时间相同,就只会返回1024字节,至于为什么返回1024不得而知,如果你的php生成的文件非常大,它也只返回1024,所以比较省带宽,客户端会根据服务器端发过来的修改时间自动从缓存文件里显示。

注:如果没有Last-Modified头,Cache-Control和Expires也是可以起作用的,但每次请求要返回真实的文件字节数,而不是1024

四、HOW ?

静态页面不用去管它了,如果想更好的控制静态页面的缓存,apache有几个模块可以很好的控制,这里不讨论

php页面:

这里分两种:

1、不经常改动的页面,类似新闻发布,这类页面的特点:第一次发布之后会有几次改动,随着时间推移基本不会再修改。控制策略应该是:1第一次发布之发送Last-Modified,max-age设定1天,修改过之后更新Last-Modified,max-age时间随着修改次数正常。这样似乎比较繁琐,还要记录修改次数,也可以预计一下下次可能的修改时间用Expires指定到大概时间过期

PHP代码

//header('Cache-Control: max-age=86400');//缓存一天 
header('Expires: Mon, 29 Jan 2007 08:56:01 GMT');//指定过期时间 
header('Last-Modified: '.gmdate('D, d M Y 01:01:01',$time).'GMT');//格林尼治时间,$time是文件添加时候的时间戳

2 经常改动的页面

类似bbs,论坛程序,这种页面更新速度比较快,缓存的主要作用是防止用户频繁刷新列表,导致服务器数据库负担,既要保证更新的及时性,也要保证缓存能被利用

这里一般用Cache-Control来控制,根据论坛的发帖的频率灵活控制max-age。

PHP代码

header('Cache-Control: max-age=60');//缓存一分钟 
header('Last-Modified: '.gmdate('D, d M Y 01:01:01',$time).'GMT');//格林尼治时间,$time是帖子的最后更新时间戳

五 额外

1 刷新,转到,强制刷新的区别

浏览器上有刷新和转到按键,有的浏览器支持用ctrl+F5强制刷新页面,它们的区别是什么?

转到:用户点击链接就是转到,它完全使用缓存机制,如果有Last-Modified那么不会和服务器通讯,用抓包工具可以查看到发送字节是0byte,如果缓存过期,那么它会执行F5刷新的动作。

刷新(F5):这种刷新也是根据缓存是否有Last-Modified来决定,如果有会转入304或1024(php),如果没有最后更新时间那么去服务器读取,返回真实文档大小

强制刷新:完全抛弃缓存机制,去服务器读取最新文档,向服务器发送的header如下

XML/HTML代码

Cache-Control: no-cache

2 调试工具

查看浏览器和服务器交互比较好的工具是httpwatch pro,现在的版本4.1,支持ie7

还有别的代理抓包工具可以分析,http debugging。没用过,还有tcp抓包工具,2000自带的network。另外还有tcp抓包工具,2000自带的network monitor不过不是专门针对http的比较难用。

PHP 相关文章推荐
php mysql数据库操作类
Jun 04 PHP
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
php的ZipArchive类用法实例
Oct 20 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php实现递归与无限分类的方法
Feb 16 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
简单的自定义php模板引擎
Aug 26 PHP
php分页查询mysql结果的base64处理方法示例
May 18 PHP
一步一步学习PHP(6) 面向对象
Feb 16 #PHP
一步一步学习PHP(5) 类和对象
Feb 16 #PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 #PHP
IP138 IP地址查询小偷实现代码
Feb 15 #PHP
PHP采集相关教程之一 CURL函数库
Feb 15 #PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 #PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 #PHP
You might like
桌面中心(四)数据显示
2006/10/09 PHP
php Mysql日期和时间函数集合
2007/11/16 PHP
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP闭包实例解析
2014/09/08 PHP
PHP实现简易计算器功能
2020/08/28 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
angular 服务随记小结
2019/05/06 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
python错误处理详解
2014/09/28 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
python对一个数向上取整的实例方法
2020/06/18 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
yy婚礼司仪主持词
2014/03/14 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
会计工作检讨书
2015/02/19 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书