仅在几天前,我开始使用浏览器缓存来缓存js和css文件,并保持“未修改”状态,并且效果非常好。
现在我想在系统的许多页面上应用相同的方法。例如,我有这个页面列出了数据库中的“用户”,我想缓存页面,不要用查询过载数据库。
我的问题是:这是一个好方法(页面在缓存时是否仍然执行db查询?)还是应该转向磁盘缓存还是memcached?
header("HTTP/1.1 304 Not Modified");
header("Expires: ".gmdate("D, d M Y H:i:s", time()+(60*86400))." GMT");
header("Cache-Control: must-revalidate");
mysql_query(" SELECT * FROM `users` ");
// list all users
答案 0 :(得分:2)
一个简单的磁盘缓存示例,香港专业教育学院在缓存动态内容时使用此方法,这些内容通常会像stats,菜单,rssfeeds,页面等一样发生变化。
<?php
$cacheTime=3600; /*1hour*/
if(file_exists('./cache/'.sha1('users').'.php') && $_SESSION['user_status']!=true){
$FileCreationTime = filectime('./cache/'.sha1('users').'.php');
/* Calculate file age in seconds*/
$FileAge = time() - $FileCreationTime;
/*1h cache*/
if ($FileAge > ($cacheTime)){unlink('./cache/'.sha1('users').'.php');header('Location: '.$_SERVER['REQUEST_URI']);die();}
include("./cache/".sha1('users').".php");
/*Cache is there and not older then 1hour so echo the cache*/
echo base64_decode($cache);
}else{
/*************************************************************/
//Cache is NOT there or user logged in or older then 1hour so regenerate content
//Do Content and store in $return variable
$return='';
$result = mysql_query(" SELECT * FROM `users` ");
while($row=mysql_fetch_assoc($result)){
$return .='<ul>'.$row['user'].'</ul>';
...
}
...
...
$return .='bla bla';
/*************************************************************/
/*Check if not logged in else save*/
if($_SESSION['user_status']!=true){
$cache_file_encoded = base64_encode($return);
$cache_file = <<<CACHE
<?php
/**
* Cached for:Users Page [{$_SERVER["HTTP_HOST"]}{$_SERVER['REQUEST_URI']}] Base64
*/
\$cache ="$cache_file_encoded"; ?>
CACHE;
file_put_contents('./cache/'.sha1('users').'.php',$cache_file);
}
echo $return;
}
?>