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 相关文章推荐
PHP4引用文件语句的对比
Oct 09 PHP
PHP中foreach()用法汇总
Jul 02 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 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 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
基于JavaScript实现抽奖系统
2018/01/16 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
Python实现telnet服务器的方法
2015/07/10 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
python如何爬取网页中的文字
2020/07/28 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
Android笔试题总结
2014/11/29 面试题
大学生素质拓展活动方案
2014/02/11 职场文书
运动会稿件50字
2014/02/17 职场文书
大学生应聘求职信
2014/05/26 职场文书
五一促销活动总结
2014/07/01 职场文书
自我工作评价范文
2015/03/06 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书