


Yii は複数のデータベースでマスターとスレーブの読み取りと書き込みを分離する方法を実装します。yii データベースのマスターとスレーブの読み取りと書き込み_PHP チュートリアル
Yii は、複数のデータベースでマスターとスレーブの読み取りと書き込みを分離する方法、yii データベースのマスターとスレーブの読み取りと書き込みを実装します
この記事の例では、Yii が複数のデータベースでマスターとスレーブの読み取りと書き込みの分離を実装する方法を説明します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:
Yii フレームワーク データベース マルチデータベース、マスター/スレーブ、読み書き分離実装、機能説明:
1. マスター/スレーブ データベースの読み取りと書き込みの分離を実現します。スレーブ データベース (複数可): 読み取り
。2. マスターデータベースに接続できない場合、スレーブデータベースに書き込み可能かどうかを設定できます
3. すべてのスレーブデータベースに接続できない場合、マスターデータベースを読み取り可能にするかどうかを設定できます
4. データベースからの接続が失敗した場合、N 秒以内に再接続しないように設定できます
yii 拡張機能を使用して実装すると、コードは次のようになります:
* メインデータベースはデータベースへの書き込みとデータベースからの読み取りを行います (複数の可能性があります)
* マスター/スレーブデータベースでの読み取りと書き込みの分離を実現します。マスターサーバーは接続できず、スレーブサーバーは書き込み機能を切り替えることができます
※スレーブサーバーは接続できません。マスターサーバーは読み取り機能を切り替えることができます
*lmtによる
**/
class DbConnectionMan extends CDbConnection {
パブリック $timeout = 10 //接続タイムアウト
; Public $markDeadSeconds = 600; //データベースからの接続が失敗した場合、600 秒以内にそれ以上の接続は行われません
//キャッシュをキャッシュグローバルタグとして使用します
パブリック $cacheID = 'キャッシュ';
/**
* @var array $slaves.Slave データベース接続 (読み取り) 構成配列。
* 構成符合 CDbConnection。
* @例
* 'コンポーネント'=>array(
* 'db'=>array(
* 'connectionString'=>'mysql://
* 'スレーブ'=>array(
* array('connectionString'=>'mysql://
* array('connectionString'=>'mysql://
* )
* )
*)
**/
パブリック $slaves = array(); /**
* *
* スレーブデータベースのステータスが false の場合、マスターデータベースのみが使用されます
* @var bool $enableSlave
**/
パブリック $enableSlave = true
/**
* @var smilesWrite 緊急マスターデータベースに接続できません。スレーブサーバーを切り替えます (読み取りおよび書き込み)。 */
パブリック $slavesWrite = false
/**
* @var masterRead 緊急の場合、スレーブマスターデータベースに接続できない場合は、スレーブサーバー(読み取りおよび書き込み)に切り替えます。 */
パブリック $masterRead = false;
/**
* @var _slave
*/
プライベート $_スレーブ
/**
* @var _disableWrite スレーブ (読み取り専用)
*/
プライベート $_disableWrite = true
/**
*
* createCommand メソッドを書き換えます。 1. スレーブ ライブラリを開く 2. スレーブ ライブラリから存在する 3. 現在トランザクション中ではない 4. ライブラリからデータを読み取る
* @param 文字列 $sql
* @return CDbCommand
**/
パブリック関数 createCommand($sql = null) {
if ($this->enableSlave && !emptyempty($this->slaves) && is_string($sql) && !$this->getCurrentTransaction() && self::isReadOperation($sql) && ($slave = $ this->getSlave())
) {
return $slave->createCommand($sql); } else {
If (!$this->masterRead) {
If ($this->_disableWrite && !self::isReadOperation($sql)) {
throw new CDbException("マスター データベース サーバーは現在使用できません! スレーブ サーバーでの書き込み操作を禁止します!"); returnparent::createCommand($sql); }
}
/**
* サーバーから接続リソースを取得します
* @return CDbConnection
**/
パブリック関数 getSlave() {
if (!isset($this->_slave)) {
シャッフル($this->スレーブ);
foreach ($this->slaves as $slaveConfig) {
if ($this->_isDeadServer($slaveConfig['connectionString'])) {
続く;
}
if (!isset($slaveConfig['class']))
$slaveConfig['クラス'] = 'CDbConnection';
$slaveConfig['autoConnect'] = false;
{
を試してください if ($slave = Yii::createComponent($slaveConfig)) {
Yii::app()->setComponent('dbslave', $slave);
$slave->setAttribute(PDO::ATTR_TIMEOUT, $this->timeout);
$slave->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$slave->setActive(true);
$this->_slave = $slave;
壊す;
}
} catch (例外 $e) {
$this->_markDeadServer($slaveConfig['connectionString']);
Yii::log("スレーブ データベース接続に失敗しました!ntConnection string:{$slaveConfig['connectionString']}", 'warning');
続く;
}
}
if (!isset($this->_slave)) {
$this->_slave = null;
$this->enableSlave = false;
}
}
$this->_slave を返します;
}
パブリック関数 setActive($value) {
if ($value != $this->getActive()) {
if ($value) {
{
を試してください if ($this->_isDeadServer($this->connectionString)) {
throw new CDbException('マスター データベース サーバーはすでに停止しています!');
}
//PDO::ATTR_TIMEOUT は PDO インスタンスを作成する前に設定する必要があります
$this->setAttribute(PDO::ATTR_TIMEOUT, $this->timeout);
$this->open();
} catch (例外 $e) {
$this->_markDeadServer($this->connectionString);
$slave = $this->getSlave();
Yii::log($e->getMessage(), CLogger::LEVEL_ERROR, '例外.CDbException');
if ($slave) {
$this->接続文字列 = $slave->接続文字列;
$this->ユーザー名 = $slave->ユーザー名;
$this->パスワード = $slave->パスワード;
if ($this->slavesWrite) {
$this->_disableWrite = false;
}
$this->open();
} else { //スレーブも利用できません
if ($this->masterRead) {
$this->接続文字列 = $this->接続文字列;
$this->ユーザー名 = $this->ユーザー名;
$this->パスワード = $this->パスワード;
$this->open();
} その他 {
throw new CDbException(Yii::t('yii', 'CDbConnection が DB 接続をオープンできませんでした。'), (int) $e->getCode(), $e->errorInfo);
}
}
}
} その他 {
$this->close();
}
}
}
/**
* 読み取り操作 SQL ステートメントを検出します
* *
* キーワード: 選択、記述、表示...
* 書き込み操作: UPDATE、INSERT、DELETE...
**/
パブリック静的関数 isReadOperation($sql) {
$sql = substr(ltrim($sql), 0, 10);
$sql = str_ireplace(array('SELECT', 'SHOW', 'DESCRIBE', 'PRAGMA'), '^O^', $sql); //^O^、魔法の笑顔
strpos($sql, '^O^') === 0 を返します。
}
/**
* スレーブサーバーが
マークされているかどうかの検出に失敗しました。 */
プライベート関数 _isDeadServer($c) {
$cache = Yii::app()->{$this->キャッシュID};
if ($cache && $cache->get('DeadServer::' . $c) == 1) {
true を返します。
}
false を返します。
}
/**
* 失敗した奴隷をマークします
*/
プライベート関数 _markDeadServer($c) {
$cache = Yii::app()->{$this->キャッシュID};
if ($cache) {
$cache->set('DeadServer::' . $c, 1, $this->markDeadSeconds);
}
}
}
main.php 構成:components 数组中,代码如下:
'class'=>'application.extensions.DbConnectionMan',//拡張パス
'connectionString' => 'mysql:host=192.168.1.128;dbname=db_xcpt',//メインデータベース書き込み
'emulatePrepare' => true、
'ユーザー名' => 'root'、
「パスワード」 => 「root」、
'charset' => 'utf8'、
'tablePrefix' => 'xcpt_', //テーブルプレフィックス
'enableSlave'=>true,//データベースから有効にする
'urgencyWrite'=>true,//緊急時には、メインデータベースに接続できなくなります。スレーブデータベースの書き込み機能を有効にします
。 'masterRead'=>true,//緊急事態 スレーブデータベースに接続できません マスターデータベース読み取り機能を有効にします
'slaves'=>array(//データベースより
array( //スレーブ1
'connectionString'=>'mysql:host=localhost;dbname=db_xcpt',
'emulatePrepare' => true、
'ユーザー名'=>'root'、
'パスワード'=>'root',
'charset' => 'utf8'、
'tablePrefix' => 'xcpt_', //テーブルのプレフィックス
)、
array( //スレーブ2
'connectionString'=>'mysql:host=localhost;dbname=db_xcpt',
'emulatePrepare' => true、
'ユーザー名'=>'root'、
'パスワード'=>'root',
'charset' => 'utf8'、
'tablePrefix' => 'xcpt_', //テーブルのプレフィックス
)、
)、
)、
この記事が皆さんの Yii フレームワークに基づく PHP プログラミングに役立つことを願っています。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











MySQLとPHPMyAdminは、強力なデータベース管理ツールです。 1)MySQLは、データベースとテーブルを作成し、DMLおよびSQLクエリを実行するために使用されます。 2)PHPMyAdminは、データベース管理、テーブル構造管理、データ操作、ユーザー許可管理のための直感的なインターフェイスを提供します。

他のプログラミング言語と比較して、MySQLは主にデータの保存と管理に使用されますが、Python、Java、Cなどの他の言語は論理処理とアプリケーション開発に使用されます。 MySQLは、データ管理のニーズに適した高性能、スケーラビリティ、およびクロスプラットフォームサポートで知られていますが、他の言語は、データ分析、エンタープライズアプリケーション、システムプログラミングなどのそれぞれの分野で利点があります。

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

MySQLとMariaDBの主な違いは、パフォーマンス、機能、ライセンスです。1。MySQLはOracleによって開発され、Mariadbはフォークです。 2. Mariadbは、高負荷環境でパフォーマンスを向上させる可能性があります。 3.MariaDBは、より多くのストレージエンジンと機能を提供します。 4.MySQLは二重ライセンスを採用し、MariaDBは完全にオープンソースです。既存のインフラストラクチャ、パフォーマンス要件、機能要件、およびライセンスコストを選択する際に考慮する必要があります。

記事の最初の段落の要約:YIフレームワークアプリケーションを開発するソフトウェアを選択する場合、複数の要因を考慮する必要があります。 XcodeやAndroid Studioなどのネイティブモバイルアプリケーション開発ツールは、強力な制御と柔軟性を提供できますが、Reactネイティブやフラッターなどのクロスプラットフォームフレームワークは、一度に複数のプラットフォームに展開できる利点にますます人気が高まっています。モバイル開発を新しい開発者向けに、AppsheetやGlideなどの低コードまたはノーコードプラットフォームは、アプリケーションをすばやく簡単に構築できます。さらに、AWS AmplifyやFirebaseなどのクラウドサービスプロバイダーは包括的なツールを提供します

SQLはリレーショナルデータベースを管理するための標準言語であり、MySQLはSQLを使用するデータベース管理システムです。 SQLは、CRUD操作を含むデータベースと対話する方法を定義しますが、MySQLはSQL標準を実装し、ストアドプロシージャやトリガーなどの追加機能を提供します。

MySQLとPHPMyAdminは、次の手順を通じて効果的に管理できます。1。データベースの作成と削除:PHPMyAdminをクリックして完了します。 2。テーブルの管理:テーブルを作成し、構造を変更し、インデックスを追加できます。 3。データ操作:データの挿入、更新、削除、SQLクエリの実行をサポートします。 4。データのインポートとエクスポート:SQL、CSV、XML、およびその他の形式をサポートします。 5。最適化と監視:最適化可能なコマンドを使用してテーブルを最適化し、クエリアナライザーと監視ツールを使用してパフォーマンスの問題を解決します。

MASQLのインストールは、次の手順で実現できます。1。コマンド/bin/bash-c"$(curl-fsslhttps://raw.githubusercontent.com/homebrew/install/head/install.sh)を使用して、Homebrewをインストールします。 2. Homebrewを更新し、Brewupdateを使用します。 3. mysqlをインストールし、Brewinstallmysqlを使用します。 4. mysqlサービスを開始し、Brewservicesstartmysqlを使用します。インストール後、MySQL-Uを使用できます
