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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
Phpbean路由转发的php代码
Jan 10 PHP
php下使用SMTP发邮件的代码
Jan 10 PHP
php采集速度探究总结(原创)
Apr 18 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
Laravel配合jwt使用的方法实例
Oct 25 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
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
jquery replace方法去空格
2017/05/08 jQuery
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python批量获取html内body内容的实例
2019/01/02 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python内存管理机制原理详解
2019/08/12 Python
Python实现快速排序的方法详解
2019/10/25 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
在职研究生自我鉴定
2013/10/16 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
销售会计岗位职责
2014/03/15 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
新闻通讯稿范文
2015/07/22 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
七个非常实用的Python工具包总结
2021/06/15 Python
如何用python清洗文件中的数据
2021/06/18 Python
Python读取和写入Excel数据
2022/04/20 Python