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 缓存实现代码及详细注释
May 16 PHP
PHP实现时间轴函数代码
Oct 08 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
PHP底层运行机制与工作原理详解
Jul 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获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
对VUE中的对象添加属性
2018/09/18 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
python编写猜数字小游戏
2019/10/06 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
房屋改造计划书
2014/01/10 职场文书
自我管理的活动方案
2014/08/25 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript
Github 使用python对copilot做些简单使用测试
2022/04/14 Python