加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php与浏览器缓存机制说明

发布时间:2022-02-13 18:51:12 所属栏目:PHP教程 来源:互联网
导读:浏览器的缓存策略,会暂时将浏览过的文件缓存在本地磁盘,当用户重复请求页面时,告知客户端页面并没有发生改变,可以调用缓存,那么如何知道客户端是否有页面缓存呢?从 HTTP 协议层面来说,浏览器发送请求时会先发送如下: HTTP 头: Connection Keep-Alive Dat
  浏览器的缓存策略,会暂时将浏览过的文件缓存在本地磁盘,当用户重复请求页面时,告知客户端页面并没有发生改变,可以调用缓存,那么如何知道客户端是否有页面缓存呢?从 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
  
  浏览器发出的请求中包含 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();//开源代码Cuoxin.com
  } else {
   header('Etag:' . $etag);
  }
  这里我使用当日日期来生成 etag,这样可以保证缓存最多生效一天时间,这个参数可以根据需要修改.
 
  补充说明:即便是 304 响应,实际上还是会请求服务端,因为需要建立连接来判断是否需要传输数据,304 缓存节约的是静态资源传输的开销.
 
  另一种缓存是 200 响应时的缓存,不建立连接但请求会响应 200 状态码,并从本地直接读取缓存.

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读