PHP 數據庫連接池實現
[辣雞內容,瞎玩的,別看咯~]
-
- 摘要
- 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://blog.csdn.net/jiangjunshow
PHP 數據庫連接池實現