日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP 数据库连接池实现(转)

發(fā)布時(shí)間:2025/3/15 php 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP 数据库连接池实现(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自https://blog.csdn.net/Marksinoberg/article/details/53857511

  • 摘要
  • xml
    • 讀取配置文件
      • 簡易方式
      • 常規(guī)方式
    • PHP解析XML
      • 配置文件
      • 解析
  • 數(shù)據(jù)庫連接池
  • 測(cè)試
    • 申請(qǐng)過多時(shí)拒絕請(qǐng)求
    • 已滿后拒絕放入
  • 總結(jié)

?


此文著實(shí)無聊,不要浪費(fèi)時(shí)間往下看啦?

摘要

之前總是以腳本面向過程的方式寫PHP代碼,所以很大程度上來說,既不規(guī)范,也不安全,更不容易維護(hù)。為了代碼的重用,準(zhǔn)備寫一套自己的工具庫,這樣的話,以后寫項(xiàng)目的時(shí)候就可以很輕松的進(jìn)行使用啦。

今天要進(jìn)行實(shí)現(xiàn)的是一個(gè)數(shù)據(jù)庫連接池,以配置文件的方式來實(shí)現(xiàn)。

xml

XML作為一門高可用的結(jié)構(gòu)化語言,作為配置文件真的是言簡意賅,雖然相比于近來配置文件界的YAML, JSON等翹楚來說,可能有效數(shù)據(jù)的占比比較小,但是這種冗余是有其存在的價(jià)值的。

基本上,看完xml的節(jié)點(diǎn)就可以知道其功能。這也是為什么大項(xiàng)目都會(huì)使用XML作為配置文件的原因。

可以容忍冗余,但是不能帶來一點(diǎn)歧義,或者維護(hù)困難方面的問題。

在PHP中,使用XML文件會(huì)是一件賞心悅目的事情,雖然相對(duì)于Java程序而言,如此。但是相比于Python處理,PHP程序就顯得沒有那么優(yōu)雅了。

讀取配置文件

讀取配置文件其實(shí)說白了就是對(duì)文件的讀取,然后包裝一下。我常用的有如下兩種方式。

簡易方式

第一次使用這個(gè)簡易方式的時(shí)候,真的是有點(diǎn)郁悶。

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

結(jié)果使用瀏覽器訪問這個(gè)測(cè)試用的php文件時(shí),卻只顯示了xml的內(nèi)容部分,但是節(jié)點(diǎn)信息什么的根本沒有顯示。

然后我還特地查閱了一下幫助文檔,這個(gè)函數(shù)返回的結(jié)果是字符串無疑的啊。然后vardump之后也證明了這一點(diǎn)。于是也沒有多想,還以為這種方式能自動(dòng)的過濾掉XML的標(biāo)簽TAG信息呢。

最后一個(gè)偶然的測(cè)試,打開了網(wǎng)頁源代碼,發(fā)現(xiàn)這個(gè)函數(shù)確實(shí)讀到了XML的所有信息,只不過顯示在瀏覽器上就會(huì)被瀏覽器給自動(dòng)解析了。所以只能看到相關(guān)的內(nèi)容部分。

常規(guī)方式

常規(guī)方式就是按部就班的讀取文件了。其余的話和上述方案一致。

// 讀取配置文件內(nèi)容$handle = fopen("filepath", "r"); $content = fread($handle, filesize("filepath"));
  • 1
  • 2
  • 3

PHP解析XML

上述兩種讀取文件,其實(shí)都是為了PHP解析XML來做準(zhǔn)備的。關(guān)于PHP解析XML的方式的博客有很多。方式也有很多,像simplexml,XMLReader,DOM啦等等。但是對(duì)于比較小型的xml配置文件,simplexml就足夠了。

配置文件

<?xml version="1.0" encoding="UTF-8" ?> <mysql><!-- 為防止出現(xiàn)意外,請(qǐng)按照此標(biāo)準(zhǔn)順序書寫.其實(shí)也無所謂了 --><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 { // 讀取配置文件內(nèi)容 $handle = fopen(self::$dbconfigpath, "r"); $content = fread($handle, filesize(self::$dbconfigpath)); // 獲取xml文檔根節(jié)點(diǎn),進(jìn)而獲取相關(guān)的數(shù)據(jù)庫信息 $mysql = simplexml_load_string($content); // 將獲取到的xml節(jié)點(diǎn)信息賦值給關(guān)聯(lián)數(shù)組,方便接下來的方法調(diào)用 $dbconfig['host'] = $mysql->host; $dbconfig['user'] = $mysql->user; $dbconfig['password'] = $mysql->password; $dbconfig['db'] = $mysql->db; $dbconfig['port'] = $mysql->port; // 將配置信息以關(guān)聯(lián)數(shù)組的形式返回 return $dbconfig; } catch ( Exception $e ) { throw new RuntimeException ( "<mark>讀取數(shù)據(jù)庫配置文件信息出錯(cuò)!</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

數(shù)據(jù)庫連接池

對(duì)于PHP程序而言,優(yōu)化永無止境。而數(shù)據(jù)庫連接池就在一定程度上起到了優(yōu)化的作用。其使得對(duì)用戶的每一個(gè)請(qǐng)求而言,無需每次都像數(shù)據(jù)庫申請(qǐng)鏈接資源。而是通過已存在的數(shù)據(jù)庫連接池中的鏈接來返回,從時(shí)間上,效率上,都是一個(gè)大大的提升。

于是,這里簡單的模擬了一下數(shù)據(jù)庫連接池的實(shí)現(xiàn)。核心在于維護(hù)一個(gè)“池”。

從池子中取,用畢,歸還給池子。

<?php /**x* PHP中的數(shù)據(jù)庫 工具類設(shè)計(jì)* 郭璞* 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文件丟失,無法進(jìn)行配置文件的初始化操作!</mark><br />" ); }else { require './utils.php'; } // 初始化 配置文件信息 $this->dbconfig = XMLUtil::getDBConfiguration (); // 準(zhǔn)備好數(shù)據(jù)庫連接池“偽隊(duì)列” $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>連接數(shù)據(jù)庫失敗!</mark><br />" ); array_push ( $this->dbpool, $conn ); } } /** * 從數(shù)據(jù)庫連接池中獲取一個(gè)數(shù)據(jù)庫鏈接資源 * * @throws ErrorException * @return mixed */ public function getConn() { if (count ( $this->dbpool ) <= 0) { throw new ErrorException ( "<mark>數(shù)據(jù)庫連接池中已無鏈接資源,請(qǐng)稍后重試!</mark>" ); } else { return array_pop ( $this->dbpool ); } } /** * 將用完的數(shù)據(jù)庫鏈接資源放回到數(shù)據(jù)庫連接池 * * @param unknown $conn * @throws ErrorException */ public function release($conn) { if (count ( $this->dbpool ) >= $this->poolsize) { throw new ErrorException ( "<mark>數(shù)據(jù)庫連接池已滿</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

測(cè)試

申請(qǐng)過多時(shí),拒絕請(qǐng)求

在申請(qǐng)數(shù)據(jù)庫連接小于20的時(shí)候,程序直接從數(shù)據(jù)庫連接池中獲取。

當(dāng)申請(qǐng)的數(shù)據(jù)庫鏈接資源大于數(shù)據(jù)庫連接池的上限時(shí),不予提供。并提示異常。

已滿后拒絕放入

當(dāng)數(shù)據(jù)庫連接池內(nèi)已滿的時(shí)候,如果想回首自定義的數(shù)據(jù)庫鏈接資源,則不予支持,并報(bào)錯(cuò)提示。?

總結(jié)

回顧一下,本次試驗(yàn)主要是以面向?qū)ο蟮慕嵌?#xff0c;設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)簡易的數(shù)據(jù)庫連接池。在一定程度上對(duì)PHP代碼的優(yōu)化起到了作用。

另外簡單的使用了simplexml對(duì)于XML文件的解析處理, 以及常用的對(duì)于文件讀取的操作。

轉(zhuǎn)載于:https://www.cnblogs.com/think-a-lot/p/8671612.html

總結(jié)

以上是生活随笔為你收集整理的PHP 数据库连接池实现(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。