php实现网页缓存的工具类分享


Posted in PHP onJuly 14, 2015

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 ()) {
      // 以下两种方式,哪种方式好?????
      require_once ($this->cacheid);
      echo "<!--缓存-->";
      // 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>';
  }
}

使用方法:

使用方法如下:

一部分代码放在要被缓存逻辑代码前面:

$cachedir = './Cache/'; // 设定缓存目录
    $cache = new Cache ( $cachedir, 33 ); // 省略参数即采用缺省设置, $cache = new Cache($cachedir);
    if (@$_GET ['cacheact'] != 'rewrite' || @$_GET ['clearCache'] == 'ok') // 此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
      $cache->load (); // 装载缓存,缓存有效则不执行以下页面代码
    // 页面代码开始

一部分放在被缓存逻辑代码后面:

// 页面代码结束
    $cache->write (); // 首次运行或缓存过期,生成缓存

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
php中序列化与反序列化详解
Feb 13 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
php实现微信公众号创建自定义菜单功能的实例代码
Jun 11 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 PHP
浅谈php错误提示及查错方法
Jul 14 #PHP
浅谈php的优缺点
Jul 14 #PHP
使用URL传输SESSION信息
Jul 14 #PHP
利用“多说”制作留言板、评论系统
Jul 14 #PHP
php生成数字字母的验证码图片
Jul 14 #PHP
php算法实例分享
Jul 14 #PHP
php根据生日计算年龄的方法
Jul 13 #PHP
You might like
第十二节--类的自动加载
2006/11/16 PHP
php知道与问问的采集插件代码
2010/10/12 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php封装一个异常的处理类
2017/06/08 PHP
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
Python编写单元测试代码实例
2020/09/10 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
运动会广播稿50字
2014/01/26 职场文书
企业读书活动总结
2014/06/30 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python