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的一个登录的类 [推荐]
Mar 16 PHP
php skymvc 一款轻量、简单的php
Jun 28 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
PHP 类相关函数的使用详解
May 10 PHP
深入PHP变量存储的详解
Jun 13 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
在laravel中使用with实现动态添加where条件
Oct 10 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
第十节--抽象方法和抽象类
2006/11/16 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
php文件上传类的分享
2017/07/06 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
JS中style属性
2006/10/11 Javascript
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python使用sorted排序的方法小结
2017/07/28 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Python3.4解释器用法简单示例
2019/03/22 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
清洁工岗位职责
2014/01/29 职场文书
民族团结先进个人材料
2014/02/05 职场文书
代领报检证委托书范本
2014/10/11 职场文书
单位实习鉴定评语
2015/01/04 职场文书
党支部培养考察意见
2015/06/02 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers