• 技术文章 >php教程 >php手册

    php文件缓存数据

    2016-06-13 10:45:58原创543
    在做网吧看看的时候,由于页面中存在电影的搜索功能(用户输入)

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

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

    数据缓存的形式包括:

    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."//m.sbmmt.com/m/".$val) < time()){

    @unlink($this->cacheDir."//m.sbmmt.com/m/".$val);

    }

    }

    }

    //清除所有缓存文件

    public function clear_all(){

    $files = scandir($this->cacheDir);

    foreach ($files as $val){

    @unlink($this->cacheDir."//m.sbmmt.com/m/".$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核实处理。
    上一篇:php json_encode扩展分析 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 利用PHP实现智能文件类型检测的实现代码• 建立文件交换功能的脚本(二)• PHP教程.应用实例2 • 通过缓存数据库结果提高PHP性能• 对MVC的理解,MVC理解
    1/1

    PHP中文网