如果没有自己缓存页面(或者至少是它的Etag),你就无法真正使用304.一个完整的缓存算法有点超出了范围,但总体思路是:
function getUrlEtag($url){
//some logic to get an etag, possibly stored in memcached / database / file etc.
}
function setUrlEtag($url,$etag){
//some logic to get an etag, possibly stored in memcached / database / file etc.
}
function getPageCache($url,$etag=''){
//[optional]some logic to get the page from cache instead, possibly not even using etag
}
function setPageCache($url,$content,$etag=''){
//[optional]some logic to save the page to cache, possibly not even using etag
}
ob_start();
$etag = getUrlEtag($_SERVER['REQUEST_URI']);
if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
if(($content=getPageCache($_SERVER['REQUEST_URI'],$etag))!==false){
echo $content;
exit;
}
?>
//the actual page
$content = ob_get_clean();
setUrlEtag($_SERVER['REQUEST_URI'],$etag=md5($url.$content));
function setPageCache($_SERVER['REQUEST_URI'],$content,$etag);
header("Etag: $etag");
echo $content;
?>
所有常见的陷阱都适用:您可能无法为登录用户显示缓存页面,可能更希望缓存部分内容,您自己负责防止缓存中的陈旧内容(可能在后端使用触发器或在修改时使用数据库,或者只是玩弄getUrlEtag逻辑)等等.
如果更容易控制,你也可以使用HTTP_IF_MODIFIED_SINCE.