PHP处理Etag、lastModified和Expires
之前看到robbin基于资源的HTTP Cache的实现介绍,想到这是一个很有意思的功能,原理很简单,但很多人都会忽略,于是乎打算集成到ColaPHP框架中来,让浏览器缓存动态内容,对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容,还是很有意义的。
如果在服务器端设置了Etag、lastModified和Expires之后,下次再访问同一资源的时候,一个典型的HTTP头是这样的:
以下是代码片段:Host 127.0.0.1 User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language zh-cn,zh;q=0.5 Accept-Encoding gzip,deflate Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7 Keep-Alive 300 Connection keep-alive If-Modified-Since Sat, 05 Sep 2009 12:44:56 GMT If-None-Match foobar Cache-Control max-age=0 |
关于lastModified、Etag和Expires的工作原理,可以参看http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/,简单来说:
lastModified:设定一个最后修改时间,浏览器下次访问的时候,发送一个”If-Modified-Sinc”的头信息,如果内容在这个时间之后没有更新,服务器直接返回一个304 Not Modified而不传输详细内容,可以节省带宽。
Etag:设定一个标记,浏览器下次访问时,发送一个”If-None-Match”的头信息,如果服务器内容还是这个标记没变,也直接返回一个304 Not Modified而不传输详细内容,同样可以节省带宽。
Expires:设定一个过期时间,如果当前请求在这个过期时间之类,则不发送HTTP请求,不仅可以节约服务器带宽,还可以减少服务器HTTP请求数。
主要通过header函数来发送,比较简单,直接上代码:
以下是代码片段:public static function etag($etag, $notModifiedExit = true) { if ($notModifiedExit && isset($_SERVER['HTTP_IF_NONE_MATCH']) && $etag == $_SERVER['HTTP_IF_NONE_MATCH']) { self::statusCode('304'); exit(); } header('Etag: ' . $etag); } public static function lastModified($modifiedTime, $notModifiedExit = true) { $modifiedTime = date('D, d M Y H:i:s', $modifiedTime) . ' GMT'; if ($notModifiedExit && isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $modifiedTime == $_SERVER['HTTP_IF_MODIFIED_SINCE']) { self::statusCode('304'); exit(); } header("Last-Modified: $modifiedTime"); } public static function expires($seconds = 1800) { $time = date('D, d M Y H:i:s', time() + $seconds) . ' GMT'; header("Expires: $time"); } |
如果你是用ColaPHP,可以直接在controller里面写上:
以下是代码片段:// 设定最后修改时间,通常是数据库中内容修改时间 $this->helper->response->lastModified(1252154696); // 设定内容标记,自己可以按照一定的规则来生成,当然也可以用内容最后修改的时间戳 $this->helper->response->etag('foobar'); // 设定失效时间 $this->response->expires(10); |
PS:ColaPHP近期发0.3alpha,主要改进Model和DB设计,加入了一下小功能(比如验证码),以及bugfix。
建议继续学习:
- QQ上传大文件为什么这么快 (阅读:12360)
- 在CGI中通过Etag和Cache-Control来控制流量,访问量及生效时间 (阅读:3182)
- Chrome 里 Max-age 和 ETag 的古怪逻辑 (阅读:2795)
- 基于资源的HTTP Cache的实现介绍 (阅读:2785)
- ETag 简介 (阅读:2738)
- Http 协议中ETag的用法 (阅读:2606)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:付超群 来源: 超群.com的博客
- 标签: Etag Expires lastModified
- 发布时间:2009-10-20 22:19:22
- [66] Oracle MTS模式下 进程地址与会话信
- [66] Go Reflect 性能
- [65] 如何拿下简短的域名
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则