>  기사  >  php教程  >  php文件缓存数据

php文件缓存数据

WBOY
WBOY원래의
2016-06-13 10:45:58974검색

 

在做网吧看看的时候,由于页面中存在电影的搜索功能(用户输入)

这个功能由于不能够做成静态化,那么就只能够动态,用动态的时候会对数据库,服务器压力带来很大的考验

所以就只能用到缓存数据的方式了

数据缓存的形式包括:

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)

                @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的专栏

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.