PHP实现的简单缓存类


Posted in PHP onJuly 29, 2015

本文实例讲述了PHP实现的简单缓存类。分享给大家供大家参考。具体如下:

cache.inc.php:

<?php
class Cache {
  /**
  * $dir : 缓存文件存放目录
  * $lifetime : 缓存文件有效期,单位为秒
  * $cacheid : 缓存文件路径,包含文件名
  * $ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便
  */
  private $dir;
  private $lifetime;
  private $cacheid;
  private $ext;
  /**
  * 析构函数,检查缓存目录是否有效,默认赋值
  */
  function __construct($dir='',$lifetime=1800) {
    if ($this->dir_isvalid($dir)) {
      $this->dir = $dir;
      $this->lifetime = $lifetime;
      $this->ext = '.Php';
      $this->cacheid = $this->getcacheid();
    }
  }
  /**
  * 检查缓存是否有效
  */
  private function isvalid() {
    if (!file_exists($this->cacheid)) return false;
    if (!(@$mtime = filemtime($this->cacheid))) return false;
    if (mktime() - $mtime > $this->lifetime) return false;
    return true;
  }
  /**
  * 写入缓存
  * $mode == 0 , 以浏览器缓存的方式取得页面内容
  * $mode == 1 , 以直接赋值(通过$content参数接收)的方式取得页面内容
  * $mode == 2 , 以本地读取(fopen ile_get_contents)的方式取得页面内容(似乎这种方式没什么必要)
  */
  public function write($mode=0,$content='') {
    switch ($mode) {
      case 0:
        $content = ob_get_contents();
        break;
      default:
        break;
    }
    ob_end_flush();
    try {
      file_put_contents($this->cacheid,$content);
    }
    catch (Exception $e) {
      $this->error('写入缓存失败!请检查目录权限!');
    }
  }
  /**
  * 加载缓存
  * exit() 载入缓存后终止原页面程序的执行,缓存无效则运行原页面程序生成缓存
  * ob_start() 开启浏览器缓存用于在页面结尾处取得页面内容
  */
  public function load() {
    if ($this->isvalid()) {
      echo "<span style='display:none;'>This is Cache.</span> ";
      //以下两种方式,哪种方式好?????
      require_once($this->cacheid);
      //echo file_get_contents($this->cacheid);
      exit();
    }
    else {
      ob_start();
    }
  }
  /**
  * 清除缓存
  */
  public function clean() {
    try {
      unlink($this->cacheid);
    }
    catch (Exception $e) {
      $this->error('清除缓存文件失败!请检查目录权限!');
    }
  }
  /**
  * 取得缓存文件路径
  */
  private function getcacheid() {
    return $this->dir.md5($this->geturl()).$this->ext;
  }
  /**
  * 检查目录是否存在或是否可创建
  */
  private function dir_isvalid($dir) {
    if (is_dir($dir)) return true;
    try {
      mkdir($dir,0777);
    }
    catch (Exception $e) {
       $this->error('所设定缓存目录不存在并且创建失败!请检查目录权限!');
       return false;      
    }
    return true;
  }
  /**
  * 取得当前页面完整url
  */
  private function geturl() {
    $url = '';
    if (isset($_SERVER['REQUEST_URI'])) {
      $url = $_SERVER['REQUEST_URI'];
    }
    else {
      $url = $_SERVER['Php_SELF'];
      $url .= empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING'];
    }
    return $url;
  }
  /**
  * 输出错误信息
  */
  private function error($str) {
    echo '<div style="color:red;">'.$str.'</div>';
  }
}
?>

demo.php:

<?php
/*
* 可自由转载使用,请保留版权信息,谢谢使用!
* Class Name : Cache (For Php5)
* Version : 1.0
* Description : 动态缓存类,用于控制页面自动生成缓存、调用缓存、更新缓存、删除缓存.
* Last Modify : 2007-8-22
* Remark :
 1.此版本为Php5版本,本人暂没有写Php4的版本,如需要请自行参考修改(比较容易啦,不要那么懒嘛,呵呵!).
 2.此版本为utf-8编码,如果网站采用其它编码请自行转换,Windows系统用记事本打开另存为,选择相应编码即可(一般ANSI),Linux下请使用相应编辑软件或iconv命令行.
 3.拷贝粘贴的就不用管上面第2条了.
* 关于缓存的一点感想:
* 动态缓存和静态缓存的根本差别在于其是自动的,用户访问页面过程就是生成缓存、浏览缓存、更新缓存的过程,无需人工操作干预.
* 静态缓存指的就是生成静态页面,相关操作一般是在网站后台完成,需人工操作(也就是手动生成).
*/
/*
* 使用方法举例*/
//Demo1:
  require_once('cache.inc.php');
  $cachedir = './Cache/'; //设定缓存目录
  $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
  if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
    $cache->load(); //装载缓存,缓存有效则不执行以下页面代码
  //页面代码开始
  echo date('H:i:s jS F');
  //页面代码结束
  $cache->write(); //首次运行或缓存过期,生成缓存
//Demo2:
  require_once('cache.inc.php');
  $cachedir = './Cache/'; //设定缓存目录
  $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
  if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
    $cache->load(); //装载缓存,缓存有效则不执行以下页面代码
  //页面代码开始
  $content = date('H:i:s jS F');
  echo $content;
  //页面代码结束
  $cache->write(1,$content); //首次运行或缓存过期,生成缓存
//Demo3:
  require_once('cache.inc.php');
  define('CACHEENABLE',true);
  if (CACHEENABLE) {
    $cachedir = './Cache/'; //设定缓存目录
    $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
    if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
      $cache->load(); //装载缓存,缓存有效则不执行以下页面代码  
  }
  //页面代码开始
  $content = date('H:i:s jS F');
  echo $content;
  //页面代码结束
  if (CACHEENABLE)
    $cache->write(1,$content); //首次运行或缓存过期,生成缓存
?>

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

PHP 相关文章推荐
一个高ai的分页函数和一个url函数
Oct 09 PHP
php获取字段名示例分享
Mar 03 PHP
php使用websocket示例详解
Mar 12 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
php中session与cookie的比较
Jan 27 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
PHP自定义错误处理的方法分析
Dec 19 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 PHP
PHP实现简单爬虫的方法
Jul 29 #PHP
php获取网站百度快照日期的方法
Jul 29 #PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 #PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 #PHP
PHP模拟QQ登录的方法
Jul 29 #PHP
PHP实现动态web服务器方法
Jul 29 #PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 #PHP
You might like
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
新版PHP极大的增强功能和性能
2006/10/09 PHP
随机广告显示(PHP函数)
2006/10/09 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
Js中sort()方法的用法
2006/11/04 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
工程质量承诺书
2014/03/27 职场文书
公司寄语大全
2014/04/10 职场文书
地震捐款倡议书
2014/08/29 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
材料采购员岗位职责
2015/04/03 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫