转自https://blog.csdn.net/Marksinoberg/article/details/53857511

  • 摘要
  • xml
    • 读取配置文件

      • 简易方式
      • 常规方式
    • PHP解析XML
      • 配置文件
      • 解析
  • 数据库连接池
  • 测试
    • 申请过多时拒绝请求
    • 已满后拒绝放入
  • 总结


此文着实无聊,不要浪费时间往下看啦 

摘要

之前总是以脚本面向过程的方式写PHP代码,所以很大程度上来说,既不规范,也不安全,更不容易维护。为了代码的重用,准备写一套自己的工具库,这样的话,以后写项目的时候就可以很轻松的进行使用啦。

今天要进行实现的是一个数据库连接池,以配置文件的方式来实现。

xml

XML作为一门高可用的结构化语言,作为配置文件真的是言简意赅,虽然相比于近来配置文件界的YAML, JSON等翘楚来说,可能有效数据的占比比较小,但是这种冗余是有其存在的价值的。

基本上,看完xml的节点就可以知道其功能。这也是为什么大项目都会使用XML作为配置文件的原因。

可以容忍冗余,但是不能带来一点歧义,或者维护困难方面的问题。

在PHP中,使用XML文件会是一件赏心悦目的事情,虽然相对于Java程序而言,如此。但是相比于Python处理,PHP程序就显得没有那么优雅了。

读取配置文件

读取配置文件其实说白了就是对文件的读取,然后包装一下。我常用的有如下两种方式。

简易方式

第一次使用这个简易方式的时候,真的是有点郁闷。

$content = file_get_contents("filename.xml");
echo $content;
  • 1
  • 2

结果使用浏览器访问这个测试用的php文件时,却只显示了xml的内容部分,但是节点信息什么的根本没有显示。

然后我还特地查阅了一下帮助文档,这个函数返回的结果是字符串无疑的啊。然后vardump之后也证明了这一点。于是也没有多想,还以为这种方式能自动的过滤掉XML的标签TAG信息呢。

最后一个偶然的测试,打开了网页源代码,发现这个函数确实读到了XML的所有信息,只不过显示在浏览器上就会被浏览器给自动解析了。所以只能看到相关的内容部分。

常规方式

常规方式就是按部就班的读取文件了。其余的话和上述方案一致。

// 读取配置文件内容$handle = fopen("filepath", "r"); $content = fread($handle, filesize("filepath"));
  • 1
  • 2
  • 3

PHP解析XML

上述两种读取文件,其实都是为了PHP解析XML来做准备的。关于PHP解析XML的方式的博客有很多。方式也有很多,像simplexml,XMLReader,DOM啦等等。但是对于比较小型的xml配置文件,simplexml就足够了。

配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<mysql><!-- 为防止出现意外,请按照此标准顺序书写.其实也无所谓了 --><host>localhost</host> <user>root</user> <password>123456</password> <db>test</db> <port>3306</port> </mysql> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析

<?php
/*** 作为解析XML配置文件必备工具*/
class XMLUtil { public static $dbconfigpath = "./db.config.xml"; public static function getDBConfiguration() { $dbconfig = array (); try { // 读取配置文件内容 $handle = fopen(self::$dbconfigpath, "r"); $content = fread($handle, filesize(self::$dbconfigpath)); // 获取xml文档根节点,进而获取相关的数据库信息 $mysql = simplexml_load_string($content); // 将获取到的xml节点信息赋值给关联数组,方便接下来的方法调用 $dbconfig['host'] = $mysql->host; $dbconfig['user'] = $mysql->user; $dbconfig['password'] = $mysql->password; $dbconfig['db'] = $mysql->db; $dbconfig['port'] = $mysql->port; // 将配置信息以关联数组的形式返回 return $dbconfig; } catch ( Exception $e ) { throw new RuntimeException ( "<mark>读取数据库配置文件信息出错!</mark><br />" ); } return $dbconfig; } }
  • 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

数据库连接池

对于PHP程序而言,优化永无止境。而数据库连接池就在一定程度上起到了优化的作用。其使得对用户的每一个请求而言,无需每次都像数据库申请链接资源。而是通过已存在的数据库连接池中的链接来返回,从时间上,效率上,都是一个大大的提升。

于是,这里简单的模拟了一下数据库连接池的实现。核心在于维护一个“池”。

从池子中取,用毕,归还给池子。

<?php
/**x*  PHP中的数据库 工具类设计*  郭璞*  2016年12月23日*  **/
class DbHelper {private $dbconfig;private $dbpool;public $poolsize;public function __construct($poolsize = 20) { if (! file_exists ( "./utils.php" )) { throw new RuntimeException ( "<mark>utils.php文件丢失,无法进行配置文件的初始化操作!</mark><br />" ); }else { require './utils.php'; } // 初始化 配置文件信息 $this->dbconfig = XMLUtil::getDBConfiguration (); // 准备好数据库连接池“伪队列” $this->poolsize = $poolsize; $this->dbpool = array (); for($index = 1; $index <= $this->poolsize; $index ++) { $conn = mysqli_connect ( $this->dbconfig ['host'], $this->dbconfig ['user'], $this->dbconfig ['password'], $this->dbconfig ['db'] ) or die ( "<mark>连接数据库失败!</mark><br />" ); array_push ( $this->dbpool, $conn ); } } /** * 从数据库连接池中获取一个数据库链接资源 * * @throws ErrorException * @return mixed */ public function getConn() { if (count ( $this->dbpool ) <= 0) { throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" ); } else { return array_pop ( $this->dbpool ); } } /** * 将用完的数据库链接资源放回到数据库连接池 * * @param unknown $conn * @throws ErrorException */ public function release($conn) { if (count ( $this->dbpool ) >= $this->poolsize) { throw new ErrorException ( "<mark>数据库连接池已满</mark><br />" ); } else { array_push ( $this->dbpool, $conn ); } } } 
  • 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
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

测试

申请过多时,拒绝请求

在申请数据库连接小于20的时候,程序直接从数据库连接池中获取。

当申请的数据库链接资源大于数据库连接池的上限时,不予提供。并提示异常。

已满后拒绝放入

当数据库连接池内已满的时候,如果想回首自定义的数据库链接资源,则不予支持,并报错提示。 

总结

回顾一下,本次试验主要是以面向对象的角度,设计并实现了一个简易的数据库连接池。在一定程度上对PHP代码的优化起到了作用。

另外简单的使用了simplexml对于XML文件的解析处理, 以及常用的对于文件读取的操作。

转载于:https://www.cnblogs.com/think-a-lot/p/8671612.html

PHP 数据库连接池实现(转)相关推荐

  1. c#打开数据库连接池的工作机制_数据库连接池-tomcat-jdbc使用笔记

    现在 主流的数据库连接池有:Proxool.C3P0.DBCP.tomcat-jdbc.Druid.其中tomcat-jdbc是tomcat服务器比较可靠的 数据库连接池. Tomcat 在 7.0 ...

  2. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10

    问题描述: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10at com.alibab ...

  3. Druid数据库连接池使用参考

    一:添加相应依赖 druid-1.0.9.jar: mysql-connector-java-5.1.48-bin.jar 二:编写properties文件 放置位置在src中: driverClas ...

  4. mysql连接池为何不用nio_为什么要用数据库连接池?

    1.为什么要用数据库连接池? 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库 都有一定的资源负荷,尤其应用压力较大时资源占用比 ...

  5. net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 发布时间:2019-02-18 22:05, 浏览次数:1152 , 标签: EF Core DbContextPool ...

  6. 数据库连接池,实现及分析

    在我们日常对数据库操作时存在一个问题,要为每次数据操作请求建立一个数据库连接.而每次建立连接都需要花费很多开销,如加载驱动类.注册驱动.获取连接,这样如果在短时间内连接多次,就 会耗费多余的时间(加载 ...

  7. swoole实现数据库连接池

    2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id = 1;$dbh ...

  8. 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用?

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为是非常 ...

  9. 为什么数据库连接池不采用 IO 多路复用?

    欢迎关注方志朋的博客,回复"666"获面试宝典 接着,今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为 ...

  10. 数据库连接池为什么要用threadlocal呢?不用会怎样?

    点击关注公众号,Java干货及时送达 来源:blog.csdn.net/qq_42405666/article/details/108258820 这个问题我疑问了很久很久,主要如下截图. 个连接对应 ...

最新文章

  1. 妥~阿里程序员常用的 15 款开发者工具
  2. 周鸿祎:过去只能在虚拟世界里发起的网络攻击,现在都可以通过物联网直达生产一线...
  3. python考证书-计算机二级 Python 怎么考?考什么?
  4. php中mysqli_query,在PHP中如何使用mysqli_query()函数
  5. IgniteMe debug 寒假逆向生涯(2/100)
  6. 天融信防火墙NGFW4000配置
  7. python 中的路径. ./ .. ../和相对路径的写法
  8. springboot项目中日志分类
  9. [ZZ]Debug VBScript with Visual Studio
  10. Elasticsearch实战篇——Spring Boot整合ElasticSearch
  11. 暑期学校 | 东南大学2021年国际暑期学校项目:从感知理解到智能认知 (知识图谱及应用课程)...
  12. C++ 空字符('\0')和空格符(' ')
  13. Shell编程之多命令顺序执行和管道符
  14. 使用CommandLineRunner或ApplicationRunner接口创建bean
  15. php获取扫码枪的内容,一起看看js获取扫码枪输入数据的方法_WEB前端开发
  16. flask html 路径,【Python】Flask 怎样获取当前页面的相对路径
  17. java Map及其实现类的底层原理
  18. [原]tornado源码分析系列(五)[HTTPServer 层]
  19. 目录 1. 数据库优化漏斗法则 1 2. 常见优化手段 2 2.1. 索引 2 2.2. 分页 只返回需要的字段 2 2.3. 批处理 2 2.4. 其他 sp 多线程等 2 3. 索引类型 n
  20. java车牌号识别EasyPR_EasyPR-Java

热门文章

  1. Java字符串替换前缀,从Bash中的字符串中删除固定的前缀/后缀
  2. ajax juey,锋利的qjuey-ajax
  3. Eclipse(STS 4)闪退导致EGit插件异常
  4. mybatis那些事~
  5. 求最长单调子序列java,单调减子序列(java实现)
  6. loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs
  7. mysql 查询此时日期_mysql 查询日期
  8. HTML+CSS+JS实现 ❤️响应式团队❤️
  9. 基于Java jsp+servlet超市订单管理平台设计和实现【建议收藏】
  10. java定义一个方法,向控制台输出一个整数的阶乘