1、客户端缓存
<meta>标签,这是进行页面缓存最基本的方法。
<meta http-equiv="expires" content="Mon, 25 Feb 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache"/>
发送到浏览器的HTML页面中的meta标签告诉浏览器页面的缓存时间以及是否启用缓存等,programa:no-cache内容并不是保证,但大多数浏览器都遵从这个约定。
更好的方法是使用header函数,发送http头。
<?php
header('Expires: Mon, 25 Feb 2014 00:00:00 GMT');
header('Pragma: no-cache');
?>
可以进一步使用HTTP1.1版本的Cache-Control头:
<?php
header('Expires: Mon,25 Feb 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
?>
上述方法存在的问题是浏览器必须下载页面读取meta标签,浏览器第一次请求页面时,如果不存在标签就会继续下载源文件的缓存拷贝。如果浏览器与服务器之间存在缓存的代理服务器,那么浏览器就可能得到过时的页面。同时,使用HTTP协议进行缓存控制并不是并不能完全保证,Cache-Control和Pragam只是为了保险而添加,同时Expires头可能因为客户端计算机的日期设置错误而失效。
为了更好控制客户端缓存,可以根据客户端的请求来判断,用到的是Last-Modified和If-Modified-Since头,这种行为称为执行一个有条件的GET请求。
这种方法要求每次访问PHP文件时候都要发送Last-Modified头,浏览器下次请求页面时发送包含一个更新时间的If-Modified-Since头,脚本判断从这个时间之后是否更新了页面内容。没有更新就返回一个304状态码后退出。
<?php
...//get the filemtime
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastFilemtime). ' GMT');
$request = getallheaders();
if (isset($requeset['If-Modified-Since']))
{
$modifiedSince = explode(';' $request['If-Modified-Since']);
$modifiedSince = strtotime($modifiedSince[0]);
}
else
{
$modifiedSince = 0;
}
if ($lastModified <= $IfModifiedSince)
{
header('HTTP/1.1 304 Not Modified');
exit();
}
....//output content
?>
2、服务器端缓存——使用php的输出缓冲
php内置的缓存机制是输出缓冲器。当使用echo或者print的情形,可以使用输出控制函数(以ob开头)将内容存储在内存缓冲器中。
首先可以将请求的页面在输出前,存储在缓冲器中,如果页面出现了错误,可以隐藏错误而不被访问者看到。
其次可以将输出缓冲器的内容存储到一个文件中,在下一次请求时判断修改时间然后没有过期的话就直接输出文件而提高网站的访问性能。这也是进行动态网站静态缓存的非常好的实现方式。
<?php
if (file_exist('./cache.page') && $lasttime>= filemtime('./cache.page') )
{
readfile('./cache.page');
exit;
}
ob_start();
echo <<<EOT
.......
.......
EOT;
$buffer = ob_get_contents();
ob_end_flush();
$fp = fopen('./cache.page', 'w');
fwrite($fp, $buffer);
fclose($fp);
?>