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 相关文章推荐
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
PHP中数据类型转换的三种方式
Apr 02 PHP
php实现图片转换成ASCII码的方法
Apr 03 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 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解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
简单了解django文件下载方式
2020/02/10 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
python 爬取小说并下载的示例
2020/12/07 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
财务部副经理岗位职责范本
2014/06/17 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
2015年防汛工作总结
2015/05/15 职场文书
调解书格式范本
2015/05/20 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
Django基础CBV装饰器和中间件
2022/03/22 Python
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers