简单实用的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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
PHP创建XML接口示例
Jul 04 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
PHP的引用详解
2015/02/22 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
详解Python发送邮件实例
2016/01/10 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
初中新生军训方案
2014/05/13 职场文书
优秀校长事迹材料
2014/12/24 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
大学生入党自传2015
2015/06/26 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers