溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池

發(fā)布時間:2021-06-24 17:10:50 來源:億速云 閱讀:224 作者:Leah 欄目:編程語言

PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

xml

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

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

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

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

讀取配置文件

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

簡易方式

第一次使用這個簡易方式的時候,真的是有點郁悶。

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

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

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

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

常規(guī)方式

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

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

PHP解析XML

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

配置文件
<?xml version="1.0" encoding="UTF-8" ?><mysql>
    <!-- 為防止出現(xiàn)意外,請按照此標準順序書寫.其實也無所謂了 -->
    <host>localhost</host>
    <user>root</user>
    <password>123456</password>
    <db>test</db>
    <port>3306</port></mysql>
解析
<?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é)點,進而獲取相關(guān)的數(shù)據(jù)庫信息
            $mysql = simplexml_load_string($content);

            // 將獲取到的xml節(jié)點信息賦值給關(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ù)庫配置文件信息出錯!</mark><br />" );
        }
        return $dbconfig;
    }

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

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

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

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

<?php
/**x
 *  PHP中的數(shù)據(jù)庫 工具類設(shè)計
 *  郭璞
 *  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 ();

        // 準備好數(shù)據(jù)庫連接池“偽隊列”
        $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ù)庫失?。?lt;/mark><br />" );
            array_push ( $this->dbpool, $conn );
        }
    }

    /**
     * 從數(shù)據(jù)庫連接池中獲取一個數(shù)據(jù)庫鏈接資源
     *
     * @throws ErrorException
     * @return mixed
     */
    public function getConn() {
        if (count ( $this->dbpool ) <= 0) {
            throw new ErrorException ( "<mark>數(shù)據(jù)庫連接池中已無鏈接資源,請稍后重試!</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 );
        }
    }
}

測試

申請過多時,拒絕請求

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

PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池

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

PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池

已滿后拒絕放入

當數(shù)據(jù)庫連接池內(nèi)已滿的時候,如果想回首自定義的數(shù)據(jù)庫鏈接資源,則不予支持,并報錯提示。
PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池

關(guān)于PHP中怎么實現(xiàn)數(shù)據(jù)庫連接池問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI