深入理解PHP高级技巧、面向对象与核心技术之调整浏览器缓存
缓存页面是保存页面的内容的一种方式,然后在产生请求时提供这个保存的页面版本,而不是服务器上的版本。 对于动态的、PHP驱动的站点,有时我们需要确保终端用户获得的是最新的版本。 利用PHP的header()函数可以调整缓存,包括web浏览器的缓存和代理服务器的
缓存页面是保存页面的内容的一种方式,然后在产生请求时提供这个保存的页面版本,而不是服务器上的版本。
对于动态的、PHP驱动的站点,有时我们需要确保终端用户获得的是最新的版本。
利用PHP的header()函数可以调整缓存,包括web浏览器的缓存和代理服务器的缓存。
四种标头的类型:
a). Last-Modified(最后的修改时间)
b). Expires(过期时间)
c). Pragma(编译提示)
d).Cache-Control(缓存控制)
Last-Modified使用UTC时间值,使用来自服务器的更新页面的版本。
Expires标头用来表明缓存的版本过期,设置为一个以前的日期,就会强制使用服务器上的页面。
Header (“Expires: Jul 2013”);
Pragma表明页面数据应该如何被处理,可以避免对页面进行缓存。
Header(“Pragma:no-cache”);
Cache-Control能够更细致的控制
指令 |
含义 |
Public |
可以在任何地方缓存 |
Private |
只能呗浏览器缓存 |
No-cache |
不能在任何地方缓存 |
Must-revalidate |
缓存必须检查更新版本 |
Proxy-revalidate |
代理缓存必须检查更新版本 |
Max-age |
内容能被缓存的时间以秒为单位 |
s-maxage |
覆盖共享缓存的max-age值设置 |
为了避免任何系统对页面进行缓存,可以这样设置标头:
Header(“Last-Modified:Thu,5Jun 2012 14:26:00 GMT”);//Right Now
Header (“Expires:Mon,26 Jul1997 05:00:00 GMT”);//way back when
Header(“Pragma:no-cache”);
Header(“Cache-Control:no-cache”);
虽然这种方法很常见,但是很笨拙,并不是每个PHP脚本都不能缓存,设置时活跃的站点也会把一些脚本缓存一分钟或者更长时间,(很活跃的站点会频繁的收到大量的请求而缓存版本可以减少服务器的负载)
//connect to the database
$dbc = mysqli_connect();
//get latest dates as timestamps
$q = 'SELECTUNIX_TIMESTAMP(MAX(date_added)),UNIX_TIMESTAMP(MAX(date_completed)) FROMtasks';
$r = mysqli_query($dbc,$q);
list($max_a,$max_c) = mysqli_fetch_array($r,MYSQL_NUM);
$max = ($max_a > $max_c)?$max_a:$max_c;
$interval = 60 * 60 * 6;
header("Last-Modified:".gmdate("r",$max));
header("Expires:".gmdate("r",($max+$interval)));
header("Cache-Control:max-age = $interval");
?>
利用UNIX_TIMESTAMP()函数把返回值转换为整数。利用三元运算符把最新的时间赋值给$max.
1. 定义一个合理的缓存空间
$interval = 60*60*60;
2. 设置脚本最后修改时间为数据库的更新的最后时间。
header("Last-Modified:".gmdate("r",$max));
3. 设置有效期限是指当前时间加上前面定义的时间间隔。
header("Expires:".gmdate("r",($max+$interval)));
4. 取代使用一个日期值,使用秒数来设置变量max-age的值。
注意:
从理论上讲,缓存是一个不错的设计,他可以把不必要的服务器请求降低到最少,在适当控制的情况下,缓存对于服务器端和客户端都是有益的。放置在HTmL代码部分的Metaheader()方法更可靠。