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 相关文章推荐
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 PHP
php下过滤HTML代码的函数
Dec 10 PHP
初识Laravel
Oct 30 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
PHP实现微信退款功能
Oct 02 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
jquery中ajax学习笔记3
2011/10/16 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python批量修改ssh密码的实现
2019/08/08 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
小学德育工作总结2015
2015/05/12 职场文书
消费者理赔投诉书
2015/07/02 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python