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'); ?>
为了更好控制客户端缓存,可以根据客户端的请求来判断,用到的是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); ?>