Http 1.1 Etag 与 Last-Modified提高php效率


Posted in PHP onJanuary 10, 2008

在 Blog 盛行的今天,一些 Web 应用需要解析大量的 RSS Feed .如何提高效率是个非常重要的问题.在 MagpieRSS 的 Features 中列举了这样的一条: HTTP Conditional GETs Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 这里的 Etag 引起了我的注意.

什么是 Etag ?

通过阅读 RFC 2616 ,得到了对 Etag 的一点印象:

The ETag response-header field provides the current value of the entity tag for the requested variant......Entity tags are normally "strong validators," but the protocol provides a mechanism to tag an entity tag as "weak." One can think of a strong validator as one that changes whenever the bits of an entity changes, while a weak value changes whenever the meaning of an entity changes. Alternatively, one can think of a strong validator as part of an identifier for a specific entity, while a weak validator is part of an identifier for a set of semantically equivalent entities.

从上我们可以大致得知,Entity tags 本质上说是一种"强校验器",但是 HTTP 协议提供了一种通过给 Entity tags 打标签的"弱"的机制(类似于内容的校验码).虽然这段话后面通过两种方式进行了解释,但是还是有些晦涩.我看了这段话之后只是得出了 Etag 的 "E" 代表 "Entity" 而已.

Magpie 首页上提到了一篇文章: HTTP Conditional Get for RSS Hackers ,拜读之后清晰了许多.要先说说 HTTP Conditional GETs 的基本原理,很简单,就是说,从 Web 服务器取数据的时候,如果文件变化了,给我新的文件,如果文件没有变化,只需告诉客户端没有变化即可,不必再把文件取回来.这样就可节省大量的网络带宽和资源.

Etag 与 Last-Modified 是从 HTTP 1.0 到 HTTP 1.1 才有的概念.当我们从 Web 服务器获取文件的时候,只需要读取 HTTP 响应头的 Etag 与 Last-Modified 字段即可,这两个字段里面的具体内容是什么可以不管(可能会千奇百怪,RFC 2616 对 Etag 没有具体值的定义),把这两个值 Cache 在本地,下次检查文件是否更新的时候比对这两个值即可.如果没有变化,服务器的响应代码不是 HTTP 200 (OK) , 而是 304.

Http 1.1 Etag 与 Last-Modified提高php效率

如上图.目前 OpenRSS 虽然订阅了40 多个 Feed,但是响应速度很不错.在使用 Gregarius 的过程中(Lilina 也应用了 ETag),发现了 FeedBurnrer 烧录的 Feed ,几乎都是用了 Etag 的(否则估计服务器要瘫痪,Hoho).我们再测试一下 HTTP header 的响应情况:

$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:15 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8

$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:21 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT 
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8

在这个期间,我的 Blog 没有更新.所以 Last-Modified 和 ETag 返回的都是相同的值.这样 Gregarius 就不必重新解析了. 国内的 GreatNews 是支持 HTTP Conditional GETs 的,更棒的是还支持 gzip/deflate encoding.而另一个 RSS 阅读工具 POPU (周博通) 就不知道了.

以上是我的笔记,如有理解错误,请指正!

PHP 相关文章推荐
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
php设计模式之单例模式实例分析
Feb 25 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
PHP读取目录下所有文件的代码
Jan 07 #PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 #PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 #PHP
php下过滤HTML代码的函数
Dec 10 #PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 #PHP
php获得当前的脚本网址
Dec 10 #PHP
php代码把全角数字转为半角数字
Dec 10 #PHP
You might like
php 获得汉字拼音首字母的函数
2009/08/01 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
node.js超时timeout详解
2014/11/26 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
python标记语句块使用方法总结
2019/08/05 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python获取整个网页源码的方法
2020/08/03 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
企业安全生产责任书
2014/04/14 职场文书
会计主管岗位职责
2015/04/02 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python