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实现与ASP Banner组件相似的类
Oct 09 PHP
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
微信支付开发告警通知实例
2016/07/12 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
使用python实现strcmp函数功能示例
2014/03/25 Python
python处理xml文件的方法小结
2017/05/02 Python
python实现扫描日志关键字的示例
2018/04/28 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python中下标和切片的使用方法解析
2019/08/27 Python
通过python3实现投票功能代码实例
2019/09/26 Python
pygame实现非图片按钮效果
2019/10/29 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
饭店工作计划书
2014/01/10 职场文书
班级入场式解说词
2014/02/01 职场文书
银行简历自我评价
2014/02/11 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python