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 中执行系统外部命令
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
PHP中each与list用法分析
Jan 08 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 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 MemCached 高级缓存应用代码
2010/08/05 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
jQuery each()小议
2010/03/18 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
李敖北大演讲稿
2014/05/24 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
2014年教研员工作总结
2014/12/23 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
九年级英语教学反思
2016/02/15 职场文书