技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> PHP处理Etag、lastModified和Expires

PHP处理Etag、lastModified和Expires

浏览:5108次  出处信息

    之前看到robbin基于资源的HTTP Cache的实现介绍,想到这是一个很有意思的功能,原理很简单,但很多人都会忽略,于是乎打算集成到ColaPHP框架中来,让浏览器缓存动态内容,对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容,还是很有意义的。

    如果在服务器端设置了Etag、lastModified和Expires之后,下次再访问同一资源的时候,一个典型的HTTP头是这样的:

以下是代码片段:
Host            127.0.0.1
User-Agent        Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7
Accept            text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language        zh-cn,zh;q=0.5
Accept-Encoding        gzip,deflate
Accept-Charset        GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive        300
Connection        keep-alive
If-Modified-Since    Sat, 05 Sep 2009 12:44:56 GMT
If-None-Match        foobar
Cache-Control        max-age=0

    关于lastModified、Etag和Expires的工作原理,可以参看http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/,简单来说:

    lastModified:设定一个最后修改时间,浏览器下次访问的时候,发送一个”If-Modified-Sinc”的头信息,如果内容在这个时间之后没有更新,服务器直接返回一个304 Not Modified而不传输详细内容,可以节省带宽。

    Etag:设定一个标记,浏览器下次访问时,发送一个”If-None-Match”的头信息,如果服务器内容还是这个标记没变,也直接返回一个304 Not Modified而不传输详细内容,同样可以节省带宽。

    Expires:设定一个过期时间,如果当前请求在这个过期时间之类,则不发送HTTP请求,不仅可以节约服务器带宽,还可以减少服务器HTTP请求数

    主要通过header函数来发送,比较简单,直接上代码:

以下是代码片段:
public static function etag($etag, $notModifiedExit = true)
{
    if ($notModifiedExit && isset($_SERVER['HTTP_IF_NONE_MATCH']) && $etag == $_SERVER['HTTP_IF_NONE_MATCH']) {
        self::statusCode('304');
        exit();
    }
    header('Etag: ' . $etag);
}
 
public static function lastModified($modifiedTime, $notModifiedExit = true)
{
    $modifiedTime = date('D, d M Y H:i:s', $modifiedTime) . ' GMT';
    if ($notModifiedExit && isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $modifiedTime == $_SERVER['HTTP_IF_MODIFIED_SINCE']) {
        self::statusCode('304');
        exit();
    }
    header("Last-Modified: $modifiedTime");
}
 
public static function expires($seconds = 1800)
{
    $time = date('D, d M Y H:i:s', time() + $seconds) . ' GMT';
    header("Expires: $time");
}

    如果你是用ColaPHP,可以直接在controller里面写上:

以下是代码片段:
// 设定最后修改时间,通常是数据库中内容修改时间
$this->helper->response->lastModified(1252154696);
// 设定内容标记,自己可以按照一定的规则来生成,当然也可以用内容最后修改的时间戳
 $this->helper->response->etag('foobar');
// 设定失效时间
$this->response->expires(10);

    PS:ColaPHP近期发0.3alpha,主要改进Model和DB设计,加入了一下小功能(比如验证码),以及bugfix。

建议继续学习:

  1. QQ上传大文件为什么这么快    (阅读:12360)
  2. 在CGI中通过Etag和Cache-Control来控制流量,访问量及生效时间    (阅读:3182)
  3. Chrome 里 Max-age 和 ETag 的古怪逻辑    (阅读:2795)
  4. 基于资源的HTTP Cache的实现介绍    (阅读:2785)
  5. ETag 简介    (阅读:2738)
  6. Http 协议中ETag的用法    (阅读:2606)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1