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 相关文章推荐
杏林同学录(七)
Oct 09 PHP
?繁体转换的class
Oct 09 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php创建无限级树型菜单
Nov 05 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 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实现下载断点续传的方法
2014/11/12 PHP
Java中final关键字详解
2015/08/10 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
javascript 函数使用说明
2010/04/07 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
js实现购物车功能
2018/06/12 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
商业房地产广告语
2014/03/13 职场文书
高中生班主任评语
2014/04/25 职场文书
辩护意见书
2015/06/04 职场文书
golang json数组拼接的实例
2021/04/28 Golang
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
redis lua限流算法实现示例
2022/07/15 Redis