PHP单例模式数据库连接类与页面静态化实现方法


Posted in PHP onMarch 20, 2019

本文实例讲述了PHP单例模式数据库连接类与页面静态化实现方法。分享给大家供大家参考,具体如下:

数据库test中数据表account内容

PHP单例模式数据库连接类与页面静态化实现方法

单例模式的数据库连接类

db.php

<?php
//单例模式的数据库连接
class DB {
  //存储实例的静态成员变量
  static public $_instance;
  //数据库连接静态变量
  static public $_connectSource;
  //连接数据库配置,由于前几天学习了PDO,这里就使用PDO
  private $_dbConfig = array(
    'host' => 'localhost',
    'user' = > 'root',
    'password' => '',
    'database' => 'test'
  );
  //禁止外部实例化
  private function __construct() {
  }
  //实例化
  public static function getInstance() {
    if(self::$_instance instanceof self) {
      return self::$_instance;
    }
    self::$_instance = new self();
    return self::$_instance;
  }
  //数据库连接
  public function connect() {
    //如果不存在数据库连接就创建一个
    if(!self::$_connectSource) {
      try {
        $dsn = 'mysql:host='.$this->_dbConfig['host'].';dbname='.$this->_dbConfig['database'];
        $username = $this->_dbConfig['user'];
        $password = $this->_dbConfig['password'];
        self::$_connectSource = new PDO($dsn, $username, $password);
      }catch(PDOException $e) {
        echo $e->getMessage();
      }
    }
    return self::$_connectSource;
  }
}
?>

PHP实现页面静态化的例子

其实原理很简单,这里用到了几个函数,ob_start()ob_get_contents()file_put_contents()ob_start()是开启缓冲区的意思,ob_get_contents()是得到缓冲区内容的意思,file_put_contents()是把内容放到一个文件里的意思,如果不理解缓冲区的意思,可以自行百度一下,我理解的缓冲区就是,当我们要在PHP中输出一些数据显示出来时,会先经过缓冲区,而我们可以从缓冲区中得到这些内容。所以实现纯静态页面的方法就是,获取缓冲区中的内容放到一个静态文件中,并在入口中根据需求设置访问动态文件还是静态文件,这种方法一般用于数据不经常变化的动态页面中。下面就来具体的实现这个功能。

static.php

<?php
//1.使用刚才写的数据库连接类连接数据库
//2.把获取到的数据填充到模板文件中
//3.把页面转化为静态文件
//如果我们本地有这个静态文件并且这个文件生成的时间小于5分钟那么就去访问这个静态文件,filemtime()用来获取文件的最后修改时间
if(is_file('./static.shtml') && (time() - filemtime('./static.shtml')) < 300) {
  //这里很简单,直接把静态文件拿过来
  require_once('./static.shtml');
}else {
//如果不存在这个静态文件,或者这个静态文件的最后修改时间距离现在已经超过了5分钟,那么就访问动态获取数据的模板,然后更新static.shtml文件的内容
  //连接数据库
  header('Content-Type:text/html;charset=utf-8');
  require_once('./db.php');
  $connect = DB::getInstance()->connect();
  //执行查询操作
  $sql = 'select * from account';
  $res = $connect->query($sql);
  //开启缓冲区
  ob_start();
  //ob_get_clean()这个函数可以获取缓冲区的内容并清空,一会我会测试一下ob_get_clean()和ob_get_contents()的
  require_once('./static_show.php');
  //把缓冲区的内容写入到静态文件
  file_put_contents('./static.shtml', ob_get_contents());
}
?>

动态展示模板文件static_show.php

<?php
  foreach($res as $row) {
    echo '名字:'.$row['name'].'<br/>';
    echo '钱包:'.$row['money'].'<br/>';
    echo '<hr/>';
  }
?>

当我们访问static.php的时候,因为没有static.shtml,所以会先执行else的操作,展示在static_show.php并生成static.shtml文件

PHP单例模式数据库连接类与页面静态化实现方法

如果这时候我把数据库修改了,zjp的money改为800,然后再访问static.php会展示什么样的内容呢,没错,zjp的钱包还是600,为什么呢,因为它执行了if中的内容,直接显示了static.shtml,我们可以看一下static.shtml是什么样的:

PHP单例模式数据库连接类与页面静态化实现方法

如果5分钟过后再访问staitc.php呢,会显示什么呢,没错!zjp的钱包就变成800了,并且static.shtml的内容会更新为zjp的钱包是800。

测试ob_get_clean()和ob_get_contents()

测试方法很简单:

<?php
$test = 'Hello World!';
//开启缓冲区
ob_start();
//测试ob_get_contents()
echo $test;
echo ob_get_contents();
//输出结果:Hello World!Hello World!
//测试ob_get_clean()
echo $test;
echo ob_get_clean();
//输出结果:Hello World!
echo $test;
ob_get_clean();
//输出结果:
?>

这样就可以很清楚的看出来了,当我们使用了ob_get_clean()的时候,输出语句并不会输出任何值,因为ob_get_clean()会获取缓冲区中的内容并将缓冲区清空。所以当我们echo test的时候并没有得到test的时候并没有得到test的值,echo ob_get_clean()的时候却能够获取到值。而当我们使用ob_get_contents()的时候缓冲区中的内容并没有被清空。

实际上,ob_get_clean()函数相当于执行了,ob_get_contents()ob_end_clean()

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
php5.3 废弃函数小结
May 16 PHP
php中将网址转换为超链接的函数
Sep 02 PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
浅析PHP echo 和 print 语句
Jun 30 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
PHP实现的策略模式示例
Mar 20 #PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 #PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 #PHP
PHP工厂模式的日常使用
Mar 20 #PHP
PHP函数积累总结
Mar 19 #PHP
PHP与Perl之间知识点区别整理
Mar 19 #PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 #PHP
You might like
十天学会php之第十天
2006/10/09 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python实现队列的方法
2015/05/26 Python
Python生成随机数组的方法小结
2017/04/15 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
基于Django统计博客文章阅读量
2019/10/29 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
python输入中文的实例方法
2020/09/14 Python
python中的测试框架
2020/11/13 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
大学生职业生涯规划范文
2013/12/31 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
聘任书模板
2014/03/29 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2016中秋节问候语
2015/11/11 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
Python Matplotlib库实现画局部图
2021/11/17 Python