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 相关文章推荐
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
PHP合并静态文件详解
Nov 14 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
Mar 07 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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中使用Imagick操作PSD文件实例
2015/01/26 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
css图片自适应大小
2007/11/28 Javascript
IE中createElement需要注意的一个问题
2010/07/13 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
pytorch中index_select()的用法详解
2021/01/06 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
北京某公司的.net笔试题
2014/03/20 面试题
质检部经理岗位职责
2014/02/19 职场文书
元旦联欢会感言
2014/03/04 职场文书
后进生评语大全
2015/01/04 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
妇产科护理心得体会
2016/01/22 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python