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 相关文章推荐
把从SQL中取出的数据转化成XMl格式
Oct 09 PHP
php基础知识:函数基础知识
Dec 13 PHP
php 删除数组元素
Jan 16 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 PHP
PHP实现的简单排列组合算法应用示例
Jun 20 PHP
php微信公众号开发之二级菜单
Oct 20 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 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 include_path设置技巧分享
2011/07/03 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
php轻松实现文件上传功能
2016/03/03 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python文件写入write()的操作
2019/05/14 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
本科生的职业生涯规划范文
2014/01/09 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
设计师求职信
2014/07/01 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript