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读取html并截取字符串的简单代码
Nov 30 PHP
Look And Say 序列php实现代码
May 22 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
php生成图片验证码的方法
Apr 15 PHP
PHP导出带样式的Excel示例代码
Aug 28 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
php-app开发接口加密详解
Apr 18 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
写好自荐信的要点
2013/11/06 职场文书
新书吧创业计划书
2014/01/31 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript