php文件缓存数据

原创
2016-06-13 10:45:58622浏览

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

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

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

数据缓存的形式包括:

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核实处理。