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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
laravel 创建命令行命令的图文教程
Oct 23 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
解决GD中文乱码问题
2007/02/14 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
JS控制输入框内字符串长度
2014/05/21 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
wxPython之解决闪烁的问题
2018/01/15 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
校园十大歌手策划书
2014/02/01 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
企业宣传口号
2014/06/12 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
力克胡哲观后感
2015/06/10 职场文书
礼貌问候语大全
2015/11/10 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
Mysql开启外网访问
2022/05/15 MySQL