欢迎光临
我们一直在努力

php文件缓存类

最近在做微信的摇一摇跑马活动,实现原理是用户摇动手机,通过ajax往数据库写入数据(小马跑的步数),然后PC端用过ajax每一秒钟从数据库中调取一次数据(小马跑的步数),然后显示在PC屏幕上,这样就会非常频繁的读写数据库,而且小马跑步的数据只要活动结束即可清除,完全没有存入数据库的必要。

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

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

数据缓存的形式包括:

1、将数据缓存到内存,相信大家这个就会想到了Memcached.memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

2、用文件来缓存数据.将数据保存到文件中,用key=>value的形式来保存,key指文件名.这个地方必须要保证key的唯一性

设置文件的缓存时间,如果过时了就从数据库中得到数据并保存到文件中,下面是一个文件缓存类:

1、缓存数据

2、得到数据

3、判断缓存数据是否存在

4、删除某个缓存数据

5、清除过时的缓存数据

6、清除所以的缓存数据

 

<?php
class Inc_FileCache{

    private $cacheTime = 3600;        //默认缓存时间
    private $cacheDir = './cache';    //缓存绝对路径
    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");
    }
}

?>
 

在页面中的调用方法如下:

<?php
include("./cacheClass.php");

$cacheFile = new Inc_FileCache(array('cacheTime'=>60,'suffix'=>'.php'));

$value1 = '缓存成功1';
$value2 = '缓存成功2';
$value3 = '缓存成功3';

$cacheFile->set('key1',$value1);
$cacheFile->set('key2',$value2);
$cacheFile->set('key3',$value3);

echo $cacheFile->get('key3');
?>

 

对于跑马这种活动,还有一种数据存储方式是:在MySQL中创建一张使用MEMORY引擎的表。MEMORY存储引擎使用保存在内存中的内容来创建表,且默认使用哈希索引,这使得它的响应速度非常快,对创建临时表非常有用。但是,当服务器关闭时,所有存储在MEMORY表里的数据都会丢失。MEMORY表只用于特殊范围,不会用于长期存储数据。

 

分享到:更多 ()