登录  /  注册
首页 > php教程 > php手册 > 正文

php与浏览器缓存机制介绍

php中文网
发布: 2016-05-25 16:39:35
原创
1912人浏览过

浏览器的缓存策略,会暂时将浏览过的文件缓存在本地磁盘,当用户重复请求页面时,告知客户端页面并没有发生改变,可以调用缓存,那么如何知道客户端是否有页面缓存呢?从 http 协议层面来说,浏览器发送请求时会先发送如下:

HTTP 头: 

Connection Keep-Alive 
Date Sun, 06 May 2012 18:00:36 GMT 
Last-Modified Sun, 06 May 2012 17:31:02 GMT 
Etag ec1f629013925ab0fa4389ba926e8c06 
Keep-Alive timeout=15, max=299 
Server Apache/2.2.16 (Unix) DAV/2 
Vary Accept-Encoding
登录后复制

请注意其中的这两行,描述了页面的缓存信息:

Last-Modified Sun, 06 May 2012 17:31:02 GMT

Etag ec1f629013925ab0fa4389ba926e8c06这个情况下,如果服务器响应 304 状态码,浏览器会自觉地从缓存中读取数据,如果响应 200 状态码,不管有没有客户端缓存,照样从服务端读取.

按照这个理论支撑,比如站长军团大部分查询结果都是 ajax 异步获取的,二次访问就都可以通过这种方式进行缓存改造,只要客户端有缓存,就向客户端发送一个 304 响应状态码,然后退出程序执行.

浏览器发出的请求中包含 If-Modified-Since 和 If-None-Match 两个参数:

If-Modified-Since 表示询问数据的最后修改时间是否是某个时间值。然后服务器会检查数据的最后修改时间,如果是该时间则返回 304 状态码,客户端接收到该状态码后直接从本地读取缓存。这种情况有一个前置条件,即本地必须存在缓存资源,浏览器才会发送 If-Modified-Since 参数,并且值为上一次服务器返回的 Last-Modified 值。

If-None-Match 类似,它由服务器返回的 Etag 值生成,仅仅用于服务器检查数据的修改时间,可以是任意值。考虑到 If-Modified-Since 结合 Last-Modified 的方法并不被所有服务器支持,这里就只考虑使用 etag 的实现。

PHP 中通过 $_SERVER['HTTP_IF_NONE_MATCH'] 可以判断文件是否被浏览器缓存,代码片段如下:

//使用 etag 标记控制缓存 
$etag = md5(date('Ymd')); 
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) { 
    header('Etag:' . $etag, true, 304); 
    exit();//开源代码phprm.com 
} else { 
    header('Etag:' . $etag); 
}
登录后复制

这里我使用当日日期来生成 etag,这样可以保证缓存最多生效一天时间,这个参数可以根据需要修改.

补充说明:即便是 304 响应,实际上还是会请求服务端,因为需要建立连接来判断是否需要传输数据,304 缓存节约的是静态资源传输的开销.

另一种缓存是 200 响应时的缓存,不建立连接但请求会响应 200 状态码,并从本地直接读取缓存.


本文链接:

收藏随意^^请保留教程地址.

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号