php 设计数据库连接池
摘要
之前总是以脚本面向过程的方式写PHP代码,所以很大程度上来说,既不规范,也不安全,更不容易维护。为了代码的重用,准备写一套自己的工具库,这样的话,以后写项目的时候就可以很轻松的进行使用啦。
今天要进行实现的是一个数据库连接池,以配置文件的方式来实现。
xml
XML作为一门高可用的结构化语言,作为配置文件真的是言简意赅,虽然相比于近来配置文件界的YAML, JSON等翘楚来说,可能有效数据的占比比较小,但是这种冗余是有其存在的价值的。
基本上,看完xml的节点就可以知道其功能。这也是为什么大项目都会使用XML作为配置文件的原因。
可以容忍冗余,但是不能带来一点歧义,或者维护困难方面的问题。
在php中,使用XML文件会是一件赏心悦目的事情,虽然相对于Java程序而言,如此。但是相比于Python处理,PHP程序就显得没有那么优雅了。
读取配置文件
读取配置文件其实说白了就是对文件的读取,然后包装一下。我常用的有如下两种方式。
简易方式
第一次使用这个简易方式的时候,真的是有点郁闷。
$content = file_get_contents("filename.xml");
echo $content;
- 1
- 2
- 1
- 2
结果使用浏览器访问这个测试用的php文件时,却只显示了xml的内容部分,但是节点信息什么的根本没有显示。
然后我还特地查阅了一下帮助文档,这个函数返回的结果是字符串无疑的啊。然后vardump之后也证明了这一点。于是也没有多想,还以为这种方式能自动的过滤掉XML的标签TAG信息呢。
最后一个偶然的测试,打开了网页源代码,发现这个函数确实读到了XML的所有信息,只不过显示在浏览器上就会被浏览器给自动解析了。所以只能看到相关的内容部分。
常规方式
常规方式就是按部就班的读取文件了。其余的话和上述方案一致。
// 读取配置文件内容
$handle = fopen("filepath", "r");
$content = fread($handle, filesize("filepath"));
- 1
- 2
- 3
- 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
- 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
- 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
- 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文件的解析处理, 以及常用的对于文件读取的操作。
php 设计数据库连接池的更多相关文章
- 数据库连接池设计和实现(Java版本)
1 前言 数据库连接池是目前系统开发必须面对和考虑的问题,原理并不复杂,主要是减少重复连接数据库的代价:在系统中创建预期数量的数据库连接,并将这些连接以一个集合或类似生活中的池一样管理起来,用到的时候 ...
- python数据库连接池设计
一.背景: 传统访问资源,一般分为一下几个步骤: 1.实例数据驱动对象与链接资源.2.实例操作资源游标.3.获取资源.4.关闭链接资源. 根据以上步骤,我们可以很简单使用这个原始方法来访问资源为我们业 ...
- java设计思想-池化-手写数据库连接池
https://blog.csdn.net/qq_16038125/article/details/80180941 池:同一类对象集合 连接池的作用 1. 资源重用 由于数据库连接得到重用,避免了 ...
- 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】
一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...
- [数据库连接池] Java数据库连接池--DBCP浅析.
前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- MVC设计模式((javaWEB)在数据库连接池下,实现对数据库中的数据增删改查操作)
设计功能的实现: ----没有业务层,直接由Servlet调用DAO,所以也没有事务操作,所以从DAO中直接获取connection对象 ----采用MVC设计模式 ----采用到的技术 .MVC设计 ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
随机推荐
- jst格式化日期
jsp页面需引入fmt标签:<taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"> ...
- html5 canvas js(数字时钟)
<!doctype html> <html> <head> <title>canvas dClock</title> </head ...
- openstack认证实践
环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...
- Autofac Getting Started(默认的构造函数注入)
https://autofaccn.readthedocs.io/en/latest/getting-started/index.html The basic pattern for integrat ...
- AOP切面用于系统日志
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.springframework. ...
- TUNING FOR ALL FLASH DEPLOYMENTS
Ceph Tuning and Best Practices for All Flash Intel® Xeon® ServersLast updated: January 2017 TABLE OF ...
- C语言中链接影响程序的细节
参考:<深入理解计算机系统> 7.61节 链接器如何解析多重定义的全局符号 基本的原则是这样的:对于所有的全局符号,函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号. Un ...
- datagrid中用tooltip
function msgFormat(value,row){ value = value.replace(/ /g," "); return '<span title='+ ...
- java 下载文件的两种方式和java文件的上传
一:以网络的方式下载文件 try { // path是指欲下载的文件的路径. File file = new File(path); // 以流的形式下载文件. InputStream fis = n ...
- DGA短域名(360样本) mark下 下次分析可以参考
一共100万,按照长度排序后的前2000个: aagst.cnacyke.wsaefrd.ccaiqxg.ukakplh.pwalurx.pwamsmz.ccaogtp.inawwgf.inayveg ...