最近在做微信的摇一摇跑马活动,实现原理是用户摇动手机,通过ajax往数据库写入数据(小马跑的步数),然后PC端用过ajax每一秒钟从数据库中调取一次数据(小马跑的步数),然后显示在PC屏幕上,这样就会非常频繁的读写数据库,而且小马跑步的数据只要活动结束即可清除,完全没有存入数据库的必要。 这个功能由于不能够做成静态化,那么就只能够动态,用动态的时候会对数据库和服务器压力带来很大的考验。 所以就只能用到缓存数据的方式了。 数据缓存的形式包括: 1、将数据缓存到内存,相信大家这个就会想到了Memcached.memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。 2、用文件来缓存数据.将数据保存到文件中,用key=>value的形式来保存,key指文件名.这个地方必须要保证key的唯一性 设置文件的缓存时间,如果过时了就从数据库中得到数据并保存到文件中,下面是一个文件缓存类: 1、缓存数据 2、得到数据 3、判断缓存数据是否存在 4、删除某个缓存数据 5、清除过时的缓存数据 6、清除所以的缓存数据 <div><?php </div?><div>class Inc_FileCache{</div><div></div><div> private $cacheTime = 3600; //默认缓存时间</div><div> private $cacheDir = './cache'; //缓存绝对路径</div><div> private $md5 = true; //是否对键进行加密</div><div> private $suffix = ".php"; //设置文件后缀</div><div></div><div> public function __construct($config){</div><div> if( is_array( $config ) ){</div><div> foreach( $config as $key=>$val ){</div><div> $this->$key = $val;</div><div> }</div><div> }</div><div> }</div><div></div><div> //设置缓存</div><div> public function set($key,$val,$leftTime=null){</div><div> $key = $this->md5 ? md5($key) : $key;</div><div> $leftTime = $leftTime ? $leftTime : $this->cacheTime;</div><div>!file_exists($this->cacheDir) && mkdir($this->cacheDir,0777);</div><div> $file = $this->cacheDir.'/'.$key.$this->suffix;</div><div> $val = serialize($val);</div><div> @file_put_contents($file,$val) or $this->error(__line__,"文件写入失败");</div><div> @chmod($file,0777) or $this->error(__line__,"设定文件权限失败");</div><div> @touch($file,time()+$leftTime) or $this->error(__line__,"更改文件时间失败");</div><div> }</div><div></div><div> //得到缓存</div><div> public function get($key){</div><div> $this->clear();</div><div> if( $this->_isset($key) ){</div><div> $key_md5 = $this->md5 ? md5($key) : $key;</div><div> $file = $this->cacheDir.'/'.$key_md5.$this->suffix;</div><div> $val = file_get_contents($file);</div><div> return unserialize($val);</div><div> }</div><div> return null;</div><div> }</div><div></div><div> //判断文件是否有效</div><div> public function _isset($key){</div><div> $key = $this->md5 ? md5($key) : $key;</div><div> $file = $this->cacheDir.'/'.$key.$this->suffix;</div><div> if( file_exists($file) ){</div><div> if( @filemtime($file) >= time() ){</div><div> return true;</div><div> }else{</div><div> @unlink($file);</div><div> return false;</div><div> }</div><div> }</div><div> return false;</div><div> }</div><div></div><div> //删除文件</div><div> public function _unset($key){</div><div> if( $this->_isset($key) ){</div><div> $key_md5 = $this->md5 ? md5($key) : $key;</div><div> $file = $this->cacheDir.'/'.$key_md5.$this->suffix;</div><div> return @unlink($file);</div><div> }</div><div> return false;</div><div> }</div><div></div><div> //清除过期缓存文件</div><div> public function clear(){</div><div> $files = scandir($this->cacheDir);</div><div> foreach ($files as $val){</div><div> if (@filemtime($this->cacheDir."/".$val) <div> @unlink($this->cacheDir."/".$val);</div><div> }</div><div> }</div><div> }</div><div></div><div> //清除所有缓存文件</div><div> public function clear_all(){</div><div> $files = scandir($this->cacheDir);</div><div> foreach ($files as $val){</div><div> @unlink($this->cacheDir."/".$val);</div><div> }</div><div> }</div><div></div><div> private function error($line,$msg){</div><div> die("出错文件:".__file__."/n出错行:$line/n错误信息:$msg");</div><div> }</div><div>}</div><div></div><div>?></div> 在页面中的调用方法如下:<?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表只用于特殊范围,不会用于长期存储数据。 </div></div>
php文件缓存类
2018-01-13
本文作者: 小罗同学
原文链接: php文件缓存类
版权声明: 本站所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
免责声明: 文中如涉及第三方资源,均来自互联网,仅供学习研究,禁止商业使用,如有侵权,联系我们24小时内删除!
- « 上一篇PHP开发验证码方法
- 下一篇 »apicloud获取项目绝对路径与拼装文件绝对路径
评论1
暂时没有评论