• 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表只用于特殊范围,不会用于长期存储数据。


  • 相关阅读:
    ^_^【CSS代码规范】规则顺序
    【html】三
    【代码组织】♣一
    LINUX nautilus 命令
    hadoop 统计一个目录的文件大小
    hadoop基本配置信息
    linux中用到的命令
    简单的hadoop配置(我安装的问题)
    hadoop不能用root用户启动,会报错
    linux 下的ps与jps
  • 原文地址:https://www.cnblogs.com/moqiang02/p/4061266.html
Copyright © 2020-2023  润新知