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 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
图书管理程序(一)
Oct 09 PHP
Banner程序
Oct 09 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
php学习笔记之字符串常见操作总结
Jul 16 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 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
其他功能
2006/10/09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
zend framework配置操作数据库实例分析
2012/12/06 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
浅谈PHP进程管理
2019/03/08 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
python实现简单爬虫功能的示例
2016/10/24 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
Python 获取项目根路径的代码
2019/09/27 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
Pytorch之contiguous的用法
2019/12/31 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
大三学生入党思想汇报
2014/01/02 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
反邪教教育心得体会
2016/01/15 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python