文章来源:PHP开发学习门户
地址:http://www.phpthinking.com/archives/567
1、client缓存
<meta>标签,这是进行页面缓存最主要的方法。
1 |
<meta
http-equiv="expires" content="Mon,
25 Feb 2014 00:00:00 GMT"/> |
2 |
<meta
http-equiv="pragma" content="no-cache"/> |
发送到浏览器的HTML页面中的meta标签告诉浏览器页面的缓存时间以及是否启用缓存等,programa:no-cache内容并非保证,但大多数浏览器都遵从这个约定。
更好的方法是使用header函数。发送http头。
2 |
header('Expires:
Mon, 25 Feb 2014 00:00:00 GMT'); |
3 |
header('Pragma:
no-cache'); |
能够进一步使用HTTP1.1版本号的Cache-Control头:
2 |
header('Expires:
Mon,25 Feb 2014 00:00:00 GMT'); |
3 |
header('Cache-Control:
no-store, no-cache, must-revalidate'); |
4 |
header('Cache-Control:
post-check=0, pre-check=0',
FALSE); |
5 |
header('Pragma:
no-cache'); |
上述方法存在的问题是浏览器必须下载页面读取meta标签,浏览器第一次请求页面时,假设不存在标签就会继续下载源文件的缓存拷贝。
假设浏览器与server之间存在缓存的代理server,那么浏览器就可能得到过时的页面。
同一时候。使用HTTP协议进行缓存控制并非并不能全然保证,Cache-Control和Pragam仅仅是为了保险而加入,同一时候Expires头可能由于client计算机的日期设置错误而失效。
为了更好控制client缓存,能够依据client的请求来推断。用到的是Last-Modified和If-Modified-Since头,这样的行为称为运行一个有条件的GET请求。
这样的方法要求每次訪问PHP文件时候都要发送Last-Modified头,浏览器下次请求页面时发送包括一个更新时间的If-Modified-Since头。脚本推断从这个时间之后是否更新了页面内容。
没有更新就返回一个304状态码后退出。
03 |
header('Last-Modified:
' . gmdate('D,
d M Y H:i:s', $lastFilemtime). '
GMT'); |
05 |
$request = getallheaders(); |
06 |
if (isset($requeset['If-Modified-Since'])) |
08 |
$modifiedSince = explode(';' $request['If-Modified-Since']); |
09 |
$modifiedSince = strtotime($modifiedSince[0]); |
15 |
if ($lastModified <= $IfModifiedSince) |
17 |
header('HTTP/1.1
304 Not Modified'); |
2、server端缓存——使用php的输出缓冲
php内置的缓存机制是输出缓冲器。当使用echo或者print的情形,能够使用输出控制函数(以ob开头)将内容存储在内存缓冲器中。
首先能够将请求的页面在输出前,存储在缓冲器中,假设页面出现了错误,能够隐藏错误而不被訪问者看到。
其次能够将输出缓冲器的内容存储到一个文件里,在下一次请求时推断改动时间然后没有过期的话就直接输出文件而提高站点的訪问性能。
这也是进行动态站点静态缓存的很好的实现方式。
02 |
if (file_exist('./cache.page')
&& $lasttime>= filemtime('./cache.page')
) |
04 |
readfile('./cache.page'); |
14 |
$buffer =
ob_get_contents(); |
17 |
$fp = fopen('./cache.page', 'w'); |
同一时候。使用这样的方法能够将页面中额某些不常改变的部分缓存到不同的文件里,然后在请求的时候组装整个页面来返回响应。