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操作符与控制结构代码
Dec 30 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
php调用新浪短链接API的方法
Nov 08 PHP
php设计模式之委托模式
Feb 13 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 PHP
PHP封装cURL工具类与应用示例
Jul 01 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在各种web服务器的运行模式详解
2013/06/03 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
对Django外键关系的描述
2019/07/26 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Python celery原理及运行流程解析
2020/06/13 Python
python 模拟登陆163邮箱
2020/12/15 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
10条PHP编程习惯
2014/05/26 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
什么是servlet
2012/05/08 面试题
幼儿园老师辞职信
2014/01/20 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
小学生新年寄语
2014/04/03 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
公司员工培训管理制度
2015/08/04 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
redis缓存存储Session原理机制
2021/11/20 Redis
angular4实现带搜索的下拉框
2022/03/25 Javascript