在做網吧看看的時候,由於頁面中存在電影的搜索功能(用戶輸入)
這個功能由於不能夠做成靜態化,那麼就只能夠動態,用動態的時候會對數據庫,服務器壓力帶來很大的考驗
所以就只能用到緩存數據的方式了
數據緩存的形式包括:
1、將數據緩存到內存,相信大家這個就會想到了Memcached.memcached是高性能的分布式內存緩存服務器。 一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、 提高可擴展性。
2、用文件來緩存數據.將數據保存到文件中,用key=>value的形式來保存,key指文件名.這個地方必須要保證key的唯一性
設置文件的緩存時間,如果過時了就從數據庫中得到數據並保存到文件中,
下面是一個文件緩存類:
1、緩存數據
2、得到數據
3、判斷緩存數據是否存在
4、刪除某個緩存數據
5、清除過時的緩存數據
6、清除所以的緩存數據
class Inc_FileCache{
private $cacheTime = 3600; //默認緩存時間
private $cacheDir = CACHE_DIR; //緩存絕對路徑
private $md5 = true; //是否對鍵進行加密
private $suffix = ".php"; //設置文件後綴
public function __construct($config){
if( is_array( $config ) ){
foreach( $config as $key=>$val ){
$this->$key = $val;
}
}
}
//設置緩存
public function set($key,$val,$leftTime=null){
$key = $this->md5 ? md5($key) : $key;
$leftTime = $leftTime ? $leftTime : $this->cacheTime;
!file_exists($this->cacheDir) && mkdir($this->cacheDir,0777);
$file = $this->cacheDir.'/'.$key.$this->suffix;
$val = serialize($val);
@file_put_contents($file,$val) or $this->error(__line__,"文件寫入失敗");
@chmod($file,0777) or $this->error(__line__,"設定文件權限失敗");
@touch($file,time()+$leftTime) or $this->error(__line__,"更改文件時間失敗");
}
//得到緩存
public function get($key){
$this->clear();
if( $this->_isset($key) ){
$key_md5 = $this->md5 ? md5($key) : $key;
$file = $this->cacheDir.'/'.$key_md5.$this->suffix;
$val = file_get_contents($file);
return unserialize($val);
}
return null;
}
//判斷問件是否有效
public function _isset($key){
$key = $this->md5 ? md5($key) : $key;
$file = $this->cacheDir.'/'.$key.$this->suffix;
if( file_exists($file) ){
if( @filemtime($file) >= time() ){
return true;
}else{
@unlink($file);
return false;
}
}
return false;
}
//刪除文件
public function _unset($key){
if( $this->_isset($key) ){
$key_md5 = $this->md5 ? md5($key) : $key;
$file = $this->cacheDir.'/'.$key_md5.$this->suffix;
return @unlink($file);
}
return false;
}
//清除過期緩存文件
public function clear(){
$files = scandir($this->cacheDir);
foreach ($files as $val){
if (@filemtime($this->cacheDir."/".$val) < time()){
@unlink($this->cacheDir."/".$val);
}
}
}
//清除所有緩存文件
public function clear_all(){
$files = scandir($this->cacheDir);
foreach ($files as $val){
@unlink($this->cacheDir."/".$val);
}
}
private function error($line,$msg){
die("出錯文件:".__file__."/n出錯行:$line/n錯誤信息:$msg");
}
}
在頁面中的調用方法如下:
$cacheFile = new Inc_FileCache(array('cacheTime'=>60,'suffix'=>'.php'));
//得到電影熱播榜
$where = " where pid=75";
$moviehotModel = $this->getM('moviehot');
$moviehotCount = $moviehotModel->getCount($where);
if( !$cacheFile->_isset($where.$moviehotCount.'moviehot') ){
$moviehotResult = $moviehotModel->getList(" WHERE pid=75 ",'0,10',"orderby desc");
if(count($moviehotResult) > 0) {
$cacheFile->set($where.$moviehotCount.'moviehot',$moviehotResult);
}
}else{
$moviehotResult = $cacheFile->get($where.$moviehotCount.'moviehot');
}
$this->tpl['moviehotResult'] = $moviehotResult;
大家如果還有什麼好的文件緩存的代碼可以拿來共享一下
摘自 ms_X0828的專欄