博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP客户端缓存控制
阅读量:6439 次
发布时间:2019-06-23

本文共 2837 字,大约阅读时间需要 9 分钟。

hot3.png

-by 落杉

 

客户端缓存控制通常也会被叫做条件GET请求。

五种常用于控制客户端缓存的头标

  • Last-Modified (最后修改时间)
  • ETag (实体标签)
  • Expires (有效指示)
  • Pragma (编译指示)
  • Cache-Control (缓存控制)

1.Last-Modified

这个头标是一个响应头标,表示客户端(通常指浏览器)所请求资源在服务器端的最后修改时间,通常情况下客户端在接受这个头标后,在以后对这个资源的 请求会附带一个'If-Modified-Since'请求头标,而这个头标是想告诉服务器上次客户端所请求资源的最后修改时间,对于一些图 像,css,js等静态文件资源,配置好了的apache服务器会理解这些If-Modified-Since请求头标,将头标里的时间和文件的最后修改 时间进行比较并作出响应,如果二者相等则发送一个304 Not Modfied来告诉客户端所请求资源并未修改让客户端放心使用缓存中的资源,否则的话会重新发送一个新的资源和新的Last-Modified的头标。 但是对于一个动态的PHP脚本,我们即使在脚本加入了header('Last Modified: '.$time)来发送一个Last Modified响应头标,当客户端附带'If-Modified-Since'在次请求时apache服务器不会进行处理,这需要我们自己 用$_SERVER['HTTP_IF_MODIFIED_SINCE']来获取'If-Modified-Since'的值自己来进行判断处理。

2.ETag

ETag(Entity Tag)和Last-Modified类似,也是WEB服务器和客户端用于确认缓存组件的有效性的一种机制,apache 1.3和2.0的ETag格式是inode-size-timestamp,因此当资源被修改,其ETag也发生改变,ETag相对Last- Modified更精确,Last-Modified只能精确的s级别,但是ETag在多服务器可能造成混乱,所以用还是不用还得看实际情况,其相对应的 后续请求头标为If-None-Match。

3.Expires

Expires表明缓存何时因该过期(GMT时间),属于HTTP 1.0 标准,通常是用来对Cache-Control的max-age的一个补充,来兼容HTTP 1.0,不赞成单独使用Expires,因为客户端时间容易发生偏差。

4.Pragma

HTTP 1.0 标准,通常是在不缓存时使用,Pragma: no-cache。

5.Cache-Control

Cache-Control常用指令(暂时我还没找到完整版本的)

public 可以在任何地方缓存
private 只能被浏览器缓存
no-cache 不能在任何地方缓存
must-revalidate 缓存必须检查跟新版本
proxy-revalidate 代理缓存必须检查跟新版本
max-age 内容能够被缓存的时间
s-maxage 覆盖共享缓存的max-age设置

浏览器行为影响

在先前有效访问后,在以后对同一URI资源的请求中,浏览器只进行两种动作:(1)直接在缓存中去获取内容。如果先前有效访问的响应头包含 Expires,max-age的话,'打开新窗口' '输入URI回车' '前一页' '后一页'这些浏览器行为不会使浏览器在Expires,max-age设置的有效期时间内去访问服务器,而是在缓存中去获取内容,但是' 刷新' 或 '重载'例外。(2)访问服务器,根据服务器响应来获取内容。这种情况发生在设置no-cache等头标要求不缓存,或者是设置了 Expires,max-age但浏览器行为是 ' 刷新' 或 '重载'时候。'Last-Modified' 'ETag' 'must-revalidate' 等有些特殊,不直接受浏览器行为影响,它们也是访问服务器后,再由服务器判断是发送新的资源,还是发送一个304 Not Modfied让浏览器使用缓存中的资源。

PHP代码
  1. <?php  
  2. function  http_cache_control( $type = 'nocache' , $interval =0, $mktime = '' , $etag = '' ){  
  3.     if ( $type == 'nocache' ){  
  4.         header('Expires: -1' );  
  5.         header('Pragma: no-cache' );  
  6.         header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' );  
  7.     }else {  
  8.         if (isset( $_SERVER [ 'HTTP_IF_NONE_MATCH' ]) &&  $etag  &&  $_SERVER ['HTTP_IF_NONE_MATCH' ] ==  $etag ){  
  9.             header('HTTP/1.1 304 Not Modfied' );  
  10.         }elseif (isset( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ]) &&  $mktime  &&  $_SERVER ['HTTP_IF_MODIFIED_SINCE' ] ==  gmdate ( 'r' , $mktime ). ' GMT' ){  
  11.             header('HTTP/1.1 304 Not Modfied' );  
  12.         }else {  
  13.             if ( $mktime ){  
  14.                 $gmtime  =  gmdate ( 'r' , $mktime + $interval ). ' GMT' ;  
  15.                 header('Expires: ' . $gmtime );  
  16.             }  
  17.             if ( $type == 'public' ){  
  18.                 header('Cache-Control: public,max-age=' . $interval );  
  19.             }elseif ( $type == 'private' ){  
  20.                 header('Cache-Control: private,max-age=' . $interval . ',s-maxage=0' );  
  21.             }elseif ( $type == 'none' ){  
  22.                 header('must-revalidate,proxy-revalidate' );  
  23.             }  
  24.         }  
  25.         $mktime && header( 'Last-Modified: ' . gmdate ( 'r' , $mktime ) . ' GMT' );  
  26.         $etag    &&  header( 'ETag: ' . $etag );  
  27.     }  
  28. }  
  29. ?>  

转载于:https://my.oschina.net/bugyang/blog/121836

你可能感兴趣的文章
我收藏的技术知识图(每张都是大图)
查看>>
Spring Boot制作启动图案
查看>>
《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理
查看>>
hdu Oil Deposits
查看>>
彻底理解javascript中的this指针
查看>>
SAS去空格
查看>>
Spring Cloud构建微服务架构(二)服务消费者
查看>>
这些老外的开源技术养活了一票国产软件
查看>>
Maven实战(六)--- dependencies与dependencyManagement的区别
查看>>
创业者应该有的5个正常心态(转)
查看>>
php模式设计之 注册树模式
查看>>
【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
查看>>
_ENV和_G
查看>>
别做操之过急的”无效将军”,做实实在在的”日拱一卒” 纵使一年不将军,不可一日不拱卒...
查看>>
Oracle Grid Infrastructure: Understanding Split-Brain Node Eviction (文档 ID 1546004.1)
查看>>
Linux改变进程优先级的nice命令
查看>>
**16.app后端如何保证通讯安全--url签名
查看>>
win32窗口机制之CreateWindow
查看>>
C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
查看>>
awakeFromNib小总结
查看>>