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 相关文章推荐
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
PHP Cookie学习笔记
Aug 23 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
php文件上传类的分享
Jul 06 PHP
PHP空值检测函数与方法汇总
Nov 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
PHP分页显示制作详细讲解
2006/12/05 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
深入理解Django的中间件middleware
2018/03/14 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
Django实现文件上传下载
2019/10/06 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
python实现的Iou与Giou代码
2020/01/18 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
铣床操作工岗位职责
2014/06/13 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
mysql sql常用语句大全
2022/06/21 MySQL