管理员
|
楼主#
更多
发布于:2011-12-03 23:21
| | | | 在做网吧看看的时候,由于页面中存在电影的搜索功能(用户输入) 这个功能由于不能够做成静态化,那么就只能够动态,用动态的时候会对数据库,服务器压力带来很大的考验 所以就只能用到缓存数据的方式了 数据缓存的形式包括: 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; 大家如果还有什么好的文件缓存的代码可以拿来共享一下
| | | | |
|