以文件形式缓存php变量的方法


Posted in PHP onJune 26, 2015

本文实例讲述了以文件形式缓存php变量的方法。分享给大家供大家参考。具体实现方法如下:

<?php
/*
$cache_set = array(
//缓存路径 , 最后要加"/"
'cacheRoot'=>'./cache/',
//缓存时间
'cacheTime'=>20,
//cache type
'cacheType'=>1,
//扩展名
'cacheExe'=>'.php'
);
$cache = new Cache($cache_set);
$a=array('1','2');
$a="aaa";
$b='';
if($cache->cache_is("d")){
 $c=$cache->cache_read("d");
 echo "c";
 print_r($c);
}else {
$b=$cache->cache_data('d',$a);
}
print_r($b);
//$cache->clear("a");
//echo $cache->cache_read("./cache/d.php");
//echo $d;
*/
/**
 * 数据缓存类 v1.0
 * @author shooke
 * 2009-11-13 16:02:26
 * 用于缓存数据,如变量,但不能缓存页面
 */
class Cache{
 //配置
 public $config = array(
 //缓存路径
 'cacheRoot'=>'./cache/',
 //缓存时间
 'cacheTime'=>1,
 //cache 类型 1串化数据 2变量
 'cacheType'=>2,
 //扩展名
 'cacheExe'=>'.php'
 //转换中间变量
 );
 public $return_name=array();
 function __construct($cache_set = array())
 {
  if(!empty($cache_set)) $this->config=array_merge($this->config,$cache_set);
  $this->config['ClassName'] = __CLASS__;
 }
 public function clear($filename=''){
  if (file_exists($this->cache_file($filename))) {
   @unlink($this->cache_file($filename));
  }elseif (empty($filename)){
   $this->clear_dir($this->config['cacheRoot']);
  }else{
   $this->clear_dir($this->config['cacheRoot'].$filename);
   echo $this->config['cacheRoot'].$filename;
  }
 }
 //循环删除路径
 private function clear_dir($dir,$to = false)
 {
  if ($list = glob($dir.'/*'))
  {
   foreach ($list as $file)
   {
    is_dir($file) ? $this->clear_dir($file) : unlink($file);
   }
  }
  if ($to === false) rmdir($dir);
 }
 //写入缓存
 private function cache_write($filename, $writetext, $openmod='w'){
  if (!file_exists($filename)) {
   @$this->makeDir( dirname($filename ));
  }
  if(@$fp = fopen($filename, $openmod)) {
   flock($fp, 2);
   fwrite($fp, $writetext);
   fclose($fp);
   return true;
  } else {
   echo "File: $filename write error.";
   return false;
  }
 }
 //缓存有效期 有效返回 true
 public function cache_is($fileName){
  $fileName=$this->cache_file($fileName);
  if( file_exists( $fileName ) ) {
   //如果缓存时间为负数则永不过期
   if ($this->config['cacheTime'] < 0) {
    return true;
   }
   //如果缓存时间为0则一直过期
   if ($this->config['cacheTime'] == 0) {
    return false;
   }
   //获取缓存文件的建立时间
   $ctime = intval(filemtime( $fileName ));
   //比较是否大于缓存时间,是则过期 否则不过期
   if (time() - $ctime > $this->config['cacheTime']) {
    return false;
   }else {
    return true;
   }
   //文件不存在视为过期失效
  }else {
   return false;
  }
 }
 public function cache_data($name,$data){
  $varname=$name;
  $name = $this->cache_file($name);
  //config['cacheTime']==0也就是不启用缓存是直接返回数据
  if ($this->config['cacheTime'] <> 0) {
   if($this->config['cacheType']==1){
    $write_data = "<?php exit;?>".serialize($data);
    //return $data;
   }else {
    $write_data = "<?php\\r\\n\\$var= ";
    $write_data .= var_export($data,true);
    $write_data .=";\\r\\n?>";
   }
   $this->cache_write($name,$write_data);
  }
  return $data;
 }
 //缓存文件名
 private function cache_file($filename){
  return $this->config['cacheRoot'].$filename.$this->config['cacheExe'];
 }
 //读取文件
 public function cache_read($file){
  $file=$this->cache_file($file);
  if (!file_exists($file)) {
   return '';
  }
  if($this->config['cacheType']==1){
   if (function_exists('file_get_contents')){
    $cache_Content= file_get_contents($file);
   }else{
    $fopen = fopen($file,'r');
    $cache_Content = '';
    do {
     $data = fread($fopen,filesize($file));
     if (strlen($data)===0) break;
     $cache_Content .= $data;
    }while(1);
    fclose($fopen);
   }
   $cache_Content = substr($cache_Content,13);/* 去除<?php exit;?> */
   $cache_Content = unserialize($cache_Content);
   return $cache_Content;
  }else{
   include_once($file);
   return $var;
  }
 }
 //循环创建目录
 private function makeDir( $dir, $mode = 0777 ) {
  if( ! $dir ) return 0;
  $dir = str_replace( "\\\\", "/", $dir );
  $mdir = "";
  foreach( explode( "/", $dir ) as $val ) {
   $mdir .= $val."/";
   if( $val == ".." || $val == "." || trim( $val ) == "" ) continue;
   if( ! file_exists( $mdir ) ) {
    if(!@mkdir( $mdir, $mode )){
     return false;
    }
   }
  }
  return true;
 }
}
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
PHP中的session安全吗?
Jan 22 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
PHP批量去除BOM头代码分享
Jun 26 #PHP
PHP多态代码实例
Jun 26 #PHP
PHP微信开发之二维码生成类
Jun 26 #PHP
Thinkphp关闭缓存的方法
Jun 26 #PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 #PHP
php header函数的常用http头设置
Jun 25 #PHP
PHP里的单例类写法实例
Jun 25 #PHP
You might like
ftp类(example.php)
2006/10/09 PHP
杏林同学录(四)
2006/10/09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
显示、隐藏密码
2006/07/01 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
小学班级口号
2014/06/09 职场文书
化学工程专业求职信
2014/08/10 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
女性健康讲座主持词
2015/07/04 职场文书
企业安全生产检查制度
2015/08/06 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL