Yii は MySQL マルチデータベースと読み書き分離インスタンス分析を実装します、yiimysql
この記事では、Yii の MySQL マルチデータベースの実装方法と読み書きの分離を例を通して分析します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:
Yii Framework は、大規模な Web アプリケーションを開発するためのコンポーネントベースの高性能 PHP フレームワークです。 Yii は、今日の Web 2.0 アプリケーション開発に必要なほぼすべての機能を提供しており、最も強力なフレームワークの 1 つでもあります。以下では、Yii が MySQL マルチデータベースと読み書き分離をどのように実装するかを紹介します
。
少し前に、私は SNS 製品のアーキテクチャ設計を行い、プログラム フレームワークに関する多くのストレス テストを行った結果、最終的に YiiFramework を選択したのですが、なぜ社内の PHP フレームワークを選択しなかったのかというと、その理由は次のとおりです。実際、会社の枠組みはとても良いのですが、「先輩」たちは頑張って積み上げてきましたが、結局のところ、彼らは十分に成熟しておらず、大規模なプロジェクトの経験がない若者のようなものです。世界。 Yii は有名なオープンソース製品なので、多くの人が使用しているはずです。つまり、Yii を保守しているグループが存在することを意味します。また、私は以前に Yii の設計パターンとその容易な拡張性を利用して、Yii を開発しました。その評判にふさわしい責任を持ちましょう。
SNS と一般的なソーシャル製品の違いは、Web ディストリビューション、ロード バランシング、分散ファイル ストレージ、MySQL ディストリビューションなどのアーキテクチャを設計する際に、最終的には大規模な同時実行性と大規模なデータ量のテストに耐えられるかどうかです。読み取りと書き込みの分離、NoSQL、およびさまざまなキャッシュはすべて重要なアプリケーション ソリューションです。この記事では、Yii での MySQL サブデータベースとマスター/スレーブの読み取り/書き込み分離の設定と使用について説明します。
Yii はデフォルトでは読み書き分離をサポートしていません。Yii のイベント駆動モードを使用して MySQL 読み書き分離を実現できます。
Yii は強力な CActiveRecord データベース操作クラスを提供します。これは、getDbConnection メソッドをオーバーライドすることでデータベースの切り替えを実装し、イベント beforeSave、beforeDelete、および beforeFind を通じて読み取りおよび書き込みサーバーの切り替えを実装します。また、それぞれ dbconfig と modelconfig という 2 つの設定ファイルも必要です。データベースのマスター/スレーブサーバーとモデルに対応するデータベース名 (コード付き)
DBConfig.php ファイルは次のとおりです:
コードをコピーします コードは次のとおりです:
配列を返します(
'パスポート' => 配列(
'書き込み' => 配列(
'クラス' => 'CDbConnection',
'接続文字列' => 'mysql:host=10.1.39.2;dbname=db1',
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'ユーザー名' => 'root',
'パスワード' => '',
'charset' => 'utf8',
'schemaCachingDuration'=>3600,
)、
'読み取り' => 配列(
配列(
'クラス' => 'CDbConnection',
'接続文字列' => 'mysql:host=10.1.39.3;dbname=db1,
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'ユーザー名' => 'root',
'パスワード' => '',
'charset' => 'utf8',
'schemaCachingDuration'=>3600,
)、
配列(
'クラス' => 'CDbConnection',
'connectionString' => 'mysql:host=10.1.39.4;dbname=db3',
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'ユーザー名' => 'root',
'パスワード' => '',
'charset' => 'utf8',
'schemaCachingDuration'=>3600,
)、
)、
)、
);
ModelConfig.php は次のとおりです:
コードをコピーします コードは次のとおりです:
配列を返します(
//キーはデータベース名、値はモデル
'パスポート' => array('ユーザー','投稿'),
'マイクロブログ' => array('…'),
);
?>
ActiveRecord.phpは以下の通りです:
コードをコピーします コードは次のとおりです:
/**
* CActiveRecordクラスのカプセル化に基づいて、マルチライブラリとマスター/スレーブの読み書き分離を実現します
* すべてのモデルはいくつかのクラスを継承する必要があります。
*
*/
クラス ActiveRecord は CActiveRecord を拡張します
{
//モデル構成
public $modelConfig = '';
//データベース設定
public $dbConfig = '';
//複数データベースのコレクションを定義します
静的 $dataBase = array();
//現在のデータベース名
パブリック $dbName = '';
//ライブラリのタイプ (読み取りまたは書き込み) を定義します
public $dbType = '読み取り' //'読み取り' または '書き込み'
;
/**
* オリジナルベースで dbname パラメータを追加しました
* @param string $scenario モデル適用シナリオ
* @param string $dbname データベース名
*/
パブリック関数 __construct($scenario='insert', $dbname = '')
{
if (!empty($dbname))
$this->dbName = $dbname;
親::__construct($scenario);
}
/**
* 親クラスの getDbConnection メソッドをオーバーライドします
※マルチデータベースとマスタースレーブの両方をここで切り替えます
*/
パブリック関数 getDbConnection()
{
//指定されたデータベースオブジェクトが存在する場合は、直接戻ります
if (self::$dataBase[$this->dbName]!==null)
return self::$dataBase[$this->dbName];
if ($this->dbName == 'db'){
self::$dataBase[$this->dbName] = Yii::app()->getDb();
}その他{
$this->changeConn($this->dbType);
}
if(self::$dataBase[$this->dbName] CDbConnection のインスタンス){
self::$dataBase[$this->dbName]->setActive(true);
return self::$dataBase[$this->dbName];
他
throw new CDbException(Yii::t('yii','モデルには「db」CDbConnection アプリケーション コンポーネントが必要です。'));
}
/**
* 設定ファイルを取得します
* @param 不明なタイプ $type
* @param 不明なタイプ $key
*/
プライベート関数 getConfig($type="modelConfig",$key="){
$config = Yii::app()->params[$type];
if($key)
$config = $config[$key];
$config を返します;
}
/**
* データベース名を取得します
*/
プライベート関数 getDbName(){
if($this->dbName)
$this->dbName を返す;
$modelName = get_class($this->model());
$this->modelConfig = $this->getConfig('modelConfig');
//モデルに対応するデータベース名を取得します
if($this->modelConfig)foreach($this->modelConfig as $key=>$val){
if(in_array($modelName,$val)){
$dbName = $key;
休憩;
}
}
$dbName を返します;
}
/**
* データベース接続を切り替えます
* @param 不明なタイプ $dbtype
*/
保護された関数changeConn($dbtype = 'read'){
if($this->dbType == $dbtype && self::$dataBase[$this->dbName] !== null)
return self::$dataBase[$this->dbName];
$this->dbName = $this->getDbName();
if(Yii::app()->getComponent($this->dbName.'_'.$dbtype) !== null){
self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName.'_'.$dbtype);
return self::$dataBase[$this->dbName];
}
$this->dbConfig = $this->getConfig('dbConfig',$this->dbName);
//データ型に応じて対応する設定を取得します (スレーブはランダムな値です)
if($dbtype == '書き込み'){
$config = $this->dbConfig[$dbtype];
}その他{
$slavekey = array_rand($this->dbConfig[$dbtype]);
$config = $this->dbConfig[$dbtype][$slavekey];
}
//データベース設定をコンポーネントに追加します
if($dbComponent = Yii::createComponent($config)){
Yii::app()->setComponent($this->dbName.'_'.$dbtype,$dbComponent);
self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName.'_'.$dbtype);
$this->dbType = $dbtype;
return self::$dataBase[$this->dbName];
他
throw new CDbException(Yii::t('yii','モデルには「changeConn」CDbConnection アプリケーション コンポーネントが必要です。'));
}
/**
* データを保存する前にメインデータベースを選択してください
*/
保護された関数 beforeSave(){
親::beforeSave();
$this->changeConn('write');
true を返します;
}
/**
* データを削除する前にメインデータベースを選択してください
*/
保護された関数 beforeDelete(){
親::beforeDelete();
$this->changeConn('write');
true を返します;
}
/**
* データベースからデータ選択を読み取ります
*/
保護された関数 beforeFind(){
親::beforeFind();
$this->changeConn('read');
true を返します;
}
/**
* マスターライブラリオブジェクトを取得します
*/
パブリック関数 dbWrite(){
return $this->changeConn('write');
}
/**
* スレーブライブラリオブジェクトを取得します
*/
パブリック関数 dbRead(){
return $this->changeConn('read');
}
}
これは私が作成してコンポーネントフォルダーに配置したクラスです。次に、すべてのモデルがマルチデータベースとマスター/スレーブの読み取り/書き込み分離を実現するために、ネイティブ SQL をサポートし、読み取り/書き込み分離を使用する方法について説明します。同時に、これらはすでに実装されています。
この記事が皆さんの Yii フレームワークに基づく PHP プログラムの設計に役立つことを願っています。
http://www.bkjia.com/PHPjc/920979.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/920979.html技術記事 Yii の複数の MySQL データベースと読み書き分離の実装の分析例、yiimysql この記事では、Yii の複数の MySQL データベースと読み書き分離の実装方法の分析例を提供します。参考のためにみんなで共有してください。詳細な分析...