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安装问题
Oct 09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
php 保留小数点
Apr 21 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
php生成word并下载代码实例
Mar 15 PHP
PHP实现的数据对象映射模式详解
Mar 20 PHP
PHP中define() 与 const定义常量的区别详解
Jun 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
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php获取url参数方法总结
2014/11/13 PHP
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python下10个简单实例代码
2017/11/15 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
windows支持哪个版本的python
2020/07/03 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
Java servlet面试题
2012/03/04 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
企业管理标语
2014/06/10 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
vue实现滑动解锁功能
2022/03/03 Vue.js
python如何为list实现find方法
2022/05/30 Python