简单实用的PHP文本缓存类实例


Posted in PHP onMarch 22, 2019

缓存在实际使用当中应用很广泛,可以减轻对服务器数据库的访问,提高运行速度。目前很多CMS内容管理系统中频繁使用缓存机制来提高系统运行的效率。下面是一个写得不错的缓存类,可以参考下缓存的机制与写法。

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 "This is Cache. ";
   //以下两种方式,哪种方式好?????
   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 $str;
 }
}
?>

demo.php

<php
/*
 * 使用方法举例
 */
 ------------------------------------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 相关文章推荐
基于mysql的bbs设计(五)
Oct 09 PHP
实用函数9
Nov 08 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
php注销代码(session注销)
May 31 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
php文件上传的例子及参数详解
Dec 12 PHP
CentOS安装php v8js教程
Feb 26 PHP
php实现图片等比例缩放代码
Jul 23 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
php实现遍历多维数组的方法
Nov 25 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 #PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 #PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 #PHP
PHP里的$_GET数组介绍
Mar 22 #PHP
PHP匿名函数(闭包函数)详解
Mar 22 #PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 #PHP
用PHP的反射实现委托模式的讲解
Mar 22 #PHP
You might like
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
python快速排序代码实例
2013/11/21 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
python异步Web框架sanic的实现
2020/04/27 Python
Django中ORM的基本使用教程
2020/12/22 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
关于礼仪的演讲稿
2014/01/04 职场文书
2014最新实习证明模板
2014/10/02 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
授权委托书
2015/01/28 职场文书
小学中队活动总结
2015/05/11 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis