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 相关文章推荐
一个用php3编写的简单计数器
Oct 09 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
php 缩略图实现函数代码
Jun 23 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
php中session与cookie的比较
Jan 27 PHP
php文件操作相关类实例
Jun 18 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 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
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP chr()函数讲解
2019/02/11 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
浅谈python可视化包Bokeh
2018/02/07 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
python实现AES加密和解密
2019/03/27 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
20岁生日感言
2014/01/13 职场文书
教师绩效考核方案
2014/01/21 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
请假条怎么写
2014/04/10 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
导游词之潮音寺
2019/09/26 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
mysql 获取时间方式
2022/03/20 MySQL