ホームページ  >  記事  >  バックエンド開発  >  データベース接続プールの PHP 実装の詳細な分析

データベース接続プールの PHP 実装の詳細な分析

黄舟
黄舟オリジナル
2017-03-11 10:27:303112ブラウズ

要約

これまで、PHP コードは常にスクリプト指向のプロセスで記述されていたため、大部分が標準化されておらず、安全でも、保守が容易でもありませんでした。コードを再利用するために、将来プロジェクトを作成するときに簡単に使用できるように、独自のツール ライブラリのセットを作成する予定です。

今日実装するのは、構成ファイルの形式で実装されるデータベース接続プールです。

xml

XML は、可用性の高い構造化言語であるため、構成ファイルとしては非常に簡潔かつ包括的ですが、YAML や JSON などの構成ファイル業界の最近のリーダーと比較すると、有効なデータの割合は少ないかもしれません。この冗長性には価値があります。

基本的に、xml ノードを読めばその機能を知ることができます。これが、大規模なプロジェクトが構成ファイルとして XML を使用する理由です。

冗長性は許容できますが、曖昧さやメンテナンスの問題を引き起こすことはできません。

PHP では、XML ファイルを使用するのが快適ですが、Java プログラムと比較するとそうではありません。ただし、Python の処理と比較すると、PHP プログラムはそれほどエレガントではありません。

設定ファイルの読み取り

設定ファイルの読み取りとは、実際にはファイルを読み取り、それをパッケージ化することを意味します。私がよく使う方法は以下の2つです。

簡単な方法

初めてこの簡単な方法を使用したとき、私は本当に少し落ち込んでいました。

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

その結果、テストのためにブラウザでphpファイルにアクセスしたところ、xmlの内容だけが表示され、ノード情報が全く表示されませんでした。

その後、ヘルプドキュメントを確認したところ、この関数によって返される結果は間違いなく文字列であることがわかりました。次に、vardump もこれを証明しました。そのため、この方法を使えば XML タグの TAG 情報を自動的に除外できるだろうと考え、あまり深く考えませんでした。

最後の偶然のテストは、Web ページのソース コードを開くことであり、この関数が XML のすべての情報を読み取ったが、ブラウザに表示されるときにブラウザによって自動的に解析されることがわかりました。したがって、関連するコンテンツ部分のみが表示されます。

通常の方法

通常の方法は、ファイルを段階的に読み取ることです。残りは上記の計画と一致しています。

// 读取配置文件内容
            $handle = fopen("filepath", "r");            
            $content = fread($handle, filesize("filepath"));

PHPはXMLを解析します

上記2種類の読み込みファイルは、実際に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>

解析

<?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[&#39;host&#39;] = $mysql->host;            
            $dbconfig[&#39;user&#39;] = $mysql->user;            
            $dbconfig[&#39;password&#39;] = $mysql->password;            
            $dbconfig[&#39;db&#39;] = $mysql->db;            
            $dbconfig[&#39;port&#39;] = $mysql->port;            
            // 将配置信息以关联数组的形式返回
            return $dbconfig;
        } catch ( Exception $e ) {            
        throw new RuntimeException ( "<mark>读取数据库配置文件信息出错!</mark><br />" );
        }        return $dbconfig;
    }
}

データベース接続プール

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 &#39;./utils.php&#39;;
        }        // 初始化 配置文件信息
        $this->dbconfig = XMLUtil::getDBConfiguration ();        
        // 准备好数据库连接池“伪队列”
        $this->poolsize = $poolsize;
        $this->dbpool = array ();        
        for($index = 1; $index <= $this->poolsize; $index ++) {
            $conn = mysqli_connect ( $this->dbconfig [&#39;host&#39;], $this->dbconfig [&#39;user&#39;], $this->dbconfig [&#39;password&#39;], $this->dbconfig [&#39;db&#39;] ) 
            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 );
        }
    }
}

テスト

アプリケーションが多すぎる場合、リクエストは拒否されます

データベース接続のアプリケーション数が20未満の場合、プログラムはデータベース接続プールから直接取得します。

データベース接続プールの PHP 実装の詳細な分析

要求されたデータベースリンクリソースがデータベース接続プールの上限を超える場合、データベースリンクリソースは提供されません。そして例外を要求します。

データベース接続プールの PHP 実装の詳細な分析

満杯時の挿入を拒否する

データベース接続プールが満杯の場合、カスタマイズされたデータベースリンクリソースに戻りたい場合、それはサポートされておらず、エラーメッセージが報告されます。
データベース接続プールの PHP 実装の詳細な分析

概要

復習すると、この実験では主にオブジェクト指向の観点から単純なデータベース接続プールを設計および実装しました。 PHP コードをある程度最適化する役割を果たします。

さらに、simplexml は単に XML ファイルを解析し、一般的なファイル読み取り操作を実行するために使用されます。

以上がデータベース接続プールの PHP 実装の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。