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 相关文章推荐
php 执行系统命令的方法
Jul 07 PHP
PHP里的中文变量说明
Jul 23 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
PHP时间函数使用详解
Mar 21 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
暑假实习求职信范文
2013/09/22 职场文书
高中生的学习总结自我鉴定
2013/10/26 职场文书
二手书店创业计划书
2014/01/16 职场文书
普通话演讲稿
2014/09/03 职场文书
2015年教师节活动总结
2015/03/20 职场文书
活动新闻稿范文
2015/07/17 职场文书
婚礼父母致辞
2015/07/28 职场文书
小数乘法教学反思
2016/02/22 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
Nginx反向代理学习实例教程
2021/10/24 Servers