目次
Yii は、複数のデータベースでマスターとスレーブの読み取りと書き込みを分離する方法、yii データベースのマスターとスレーブの読み取りと書き込みを実装します
ホームページ バックエンド開発 PHPチュートリアル Yii は複数のデータベースでマスターとスレーブの読み取りと書き込みを分離する方法を実装します。yii データベースのマスターとスレーブの読み取りと書き込み_PHP チュートリアル

Yii は複数のデータベースでマスターとスレーブの読み取りと書き込みを分離する方法を実装します。yii データベースのマスターとスレーブの読み取りと書き込み_PHP チュートリアル

Jul 13, 2016 am 10:10 AM
mysql yii 分離 読み書き

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 数组中,代码如下:
复制代码代码如下:
'db'=>array(
'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 プログラミングに役立つことを願っています。

www.bkjia.com本当http://www.bkjia.com/PHPjc/934930.html技術記事 Yii による複数データベースのマスター・スレーブ読み書き分離を実現する方法 Yii データベースのマスター・スレーブ読み書き・書き込み この記事では、Yii による複数データベースのマスター・スレーブ読み書き分離を実現する方法の例について説明します。参考のためにみんなで共有してください。ツール...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

MySQLおよびPHPMYADMIN:コア機能と関数 MySQLおよびPHPMYADMIN:コア機能と関数 Apr 22, 2025 am 12:12 AM

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

MySQL対その他のプログラミング言語:比較 MySQL対その他のプログラミング言語:比較 Apr 19, 2025 am 12:22 AM

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

MySQLの外国キーの目的を説明してください。 MySQLの外国キーの目的を説明してください。 Apr 25, 2025 am 12:17 AM

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

mysqlとmariadbを比較対照します。 mysqlとmariadbを比較対照します。 Apr 26, 2025 am 12:08 AM

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

YIフレームワークに適したソフトウェアは何ですか? YIフレームワーク用の推奨ソフトウェア YIフレームワークに適したソフトウェアは何ですか? YIフレームワーク用の推奨ソフトウェア Apr 18, 2025 pm 11:03 PM

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

SQL対MySQL:2つの関係を明確にします SQL対MySQL:2つの関係を明確にします Apr 24, 2025 am 12:02 AM

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

MySQL:データベース、phpmyAdmin:管理インターフェイス MySQL:データベース、phpmyAdmin:管理インターフェイス Apr 29, 2025 am 12:44 AM

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

MACOSシステム上のMySQLのインストール手順の詳細な説明 MACOSシステム上のMySQLのインストール手順の詳細な説明 Apr 29, 2025 pm 03:36 PM

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

See all articles