国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

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

2020-03-22 20:11:24
字體:
供稿:網(wǎng)友
  • 摘要 xml 讀取配置文件 簡易方式 常規(guī)方式 PHP解析XML 配置文件 解析 數(shù)據(jù)庫連接池 測試 申請(qǐng)過多時(shí)拒絕請(qǐng)求 已滿后拒絕放入 總結(jié)

    摘要

    之前總是以腳本面向過程的方式寫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;

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

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

    最后一個(gè)偶然的測試,打開了網(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'));

    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>

    解析
    <?php/** * 作為解析XML配置文件必備工具 */html' target='_blank'>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;    }}

    數(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ù)庫失?。?lt;/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 );        }    }}

    測試

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

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

    正常請(qǐng)求,正常獲取

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

    數(shù)據(jù)庫連接池中無連接轉(zhuǎn)時(shí)提示異常

    已滿后拒絕放入

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

    總結(jié)

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

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

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 神木县| 巴林左旗| 五台县| 略阳县| 苗栗市| 连云港市| 留坝县| 广丰县| 晋中市| 泸定县| 子洲县| 马关县| 哈巴河县| 虹口区| 辽源市| 大庆市| 鹰潭市| 揭西县| 成武县| 丽水市| 镶黄旗| 娱乐| 简阳市| 烟台市| 贺州市| 嫩江县| 荥阳市| 建始县| 彭州市| 乌苏市| 仙桃市| 博爱县| 水城县| 名山县| 上栗县| 东丰县| 鹤壁市| 汉川市| 镇雄县| 五家渠市| 景东|