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 Cookie的一个使用注意点
Nov 08 PHP
PHP 一个随机字符串生成代码
May 26 PHP
php生成随机密码的三种方法小结
Sep 04 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
php跨服务器访问方法小结
May 12 PHP
PHP基本语法实例总结
Sep 09 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
php之header的不同用法总结(实例讲解)
Nov 28 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 PHP
浅谈PHP中的Trait使用方法
Mar 22 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
FCKeditor的安装(PHP)
2007/01/13 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
laravel自定义分页效果
2017/07/23 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
js 多浏览器分别判断代码
2010/04/01 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
jqTransform美化表单
2015/10/10 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python实现静态服务器
2019/09/05 Python
Python实现元素等待代码实例
2019/11/11 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python 忽略文件名编码的方法
2020/08/01 Python
Python连接mysql方法及常用参数
2020/09/01 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
党支部书记岗位责任制
2014/02/11 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
尝试使用Python爬取城市租房信息
2022/04/12 Python