灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2842回复:0

php文件缓存数据

楼主#
更多 发布于: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;

大家如果还有什么好的文件缓存的代码可以拿来共享一下


喜欢0 评分0
游客

返回顶部