ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2020-03-30 18:06:38  阅读:293  来源: 互联网

标签:php get ob static 单例 缓冲区 PHP contents 页面


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

数据库test中数据表account内容

单例模式的数据库连接类

db.php

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?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

1 2 3 4 5 6 7 <?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文件

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

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

测试ob_get_clean()和ob_get_contents()

测试方法很简单:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?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面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

标签:php,get,ob,static,单例,缓冲区,PHP,contents,页面
来源: https://www.cnblogs.com/lyzaidxh/p/12600099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有