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 empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
php 团购折扣计算公式
Nov 24 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
使用PHP求两个文件的相对路径
Jun 20 PHP
PHP多例模式介绍
Jun 24 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
Yii开启片段缓存的方法
Mar 28 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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
域名和cookie问题(域名后缀)
2012/10/10 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
使用URL传输SESSION信息
2015/07/14 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
Python判断字符串与大小写转换
2015/06/08 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
Django 返回json数据的实现示例
2020/03/05 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
python实现AdaBoost算法的示例
2020/10/03 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
简单说下OSPF的操作过程
2014/08/13 面试题
九年级语文教学反思
2014/02/04 职场文书
主持人开幕词
2015/01/29 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书