以文件形式缓存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 相关文章推荐
杏林同学录(四)
Oct 09 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
php实现将Session写入数据库
Jul 26 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 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
PHP多文件上传实例
2015/07/09 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python编程中的for循环语句学习教程
2015/10/14 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
import的本质解析
2017/10/30 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
测绘工程系学生的自我评价
2013/11/30 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
基层党员对照检查材料
2014/08/25 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
整脏治乱工作简报
2015/07/21 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
python 如何获取页面所有a标签下href的值
2021/05/06 Python
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏