Yii实现多数据库主从读写分离的方法_php教程
这篇文章主要介绍了Yii实现多数据库主从读写分离的方法,通过针对Yii数据库类的扩展实现多数据库主从读写的分离功能,是非常实用的技巧,需要的朋友可以参考下
本文实例讲述了Yii实现多数据库主从读写分离的方法。分享给大家供大家参考。具体分析如下:
Yii框架数据库多数据库、主从、读写分离 实现,功能描述:
1.实现主从数据库读写分离 主库:写 从库(可多个):读
2.主数据库无法连接时 可设置从数据库是否 可写
3.所有从数据库无法连接时 可设置主数据库是否 可读
4.如果从数据库连接失败 可设置N秒内不再连接
利用yii扩展实现,代码如下:
代码如下:
<?php /** * 主数据库 写 从数据库(可多个)读 * 实现主从数据库 读写分离 主服务器无法连接 从服务器可切换写功能 * 从务器无法连接 主服务器可切换读功 * by lmt * */ class DbConnectionMan extends CDbConnection { public $timeout = 10; //连接超时时间 public $markDeadSeconds = 600; //如果从数据库连接失败 600秒内不再连接 //用 cache 作为缓存全局标记 public $cacheID = 'cache'; /** * @var array $slaves.Slave database connection(Read) config array. * 配置符合 CDbConnection. * @example * 'components'=>array( * 'db'=>array( * 'connectionString'=>'mysql://<master>', * 'slaves'=>array( * array('connectionString'=>'mysql://<slave01>'), * array('connectionString'=>'mysql://<slave02>'), * ) * ) * ) * */ public $slaves = array(); /** * * 从数据库状态 false 则只用主数据库 * @var bool $enableSlave * */ public $enableSlave = true; /** * @var slavesWrite 紧急情况主数据库无法连接 切换从服务器(读写). */ public $slavesWrite = false; /** * @var masterRead 紧急情况从主数据库无法连接 切换从住服务器(读写). */ public $masterRead = false; /** * @var _slave */ private $_slave; /** * @var _disableWrite 从服务器(只读). */ private $_disableWrite = true; /** * * 重写 createCommand 方法,1.开启从库 2.存在从库 3.当前不处于一个事务中 4.从库读数据 * @param string $sql * @return CDbCommand * */ public function 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("Master db server is not available now!Disallow write operation on slave server!"); } } return parent::createCommand($sql); } } /** * 获得从服务器连接资源 * @return CDbConnection * */ public function getSlave() { if (!isset($this->_slave)) { shuffle($this->slaves); foreach ($this->slaves as $slaveConfig) { if ($this->_isDeadServer($slaveConfig['connectionString'])) { continue; } if (!isset($slaveConfig['class'])) $slaveConfig['class'] = 'CDbConnection'; $slaveConfig['autoConnect'] = false; try { 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; break; } } catch (Exception $e) { $this->_markDeadServer($slaveConfig['connectionString']); Yii::log("Slave database connection failed!ntConnection string:{$slaveConfig['connectionString']}", 'warning'); continue; } } if (!isset($this->_slave)) { $this->_slave = null; $this->enableSlave = false; } } return $this->_slave; } public function setActive($value) { if ($value != $this->getActive()) { if ($value) { try { if ($this->_isDeadServer($this->connectionString)) { throw new CDbException('Master db server is already dead!'); } //PDO::ATTR_TIMEOUT must set before pdo instance create $this->setAttribute(PDO::ATTR_TIMEOUT, $this->timeout); $this->open(); } catch (Exception $e) { $this->_markDeadServer($this->connectionString); $slave = $this->getSlave(); Yii::log($e->getMessage(), CLogger::LEVEL_ERROR, 'exception.CDbException'); if ($slave) { $this->connectionString = $slave->connectionString; $this->username = $slave->username; $this->password = $slave->password; if ($this->slavesWrite) { $this->_disableWrite = false; } $this->open(); } else { //Slave also unavailable if ($this->masterRead) { $this->connectionString = $this->connectionString; $this->username = $this->username; $this->password = $this->password; $this->open(); } else { throw new CDbException(Yii::t('yii', 'CDbConnection failed to open the DB connection.'), (int) $e->getCode(), $e->errorInfo); } } } } else { $this->close(); } } } /** * 检测读操作 sql 语句 * * 关键字: SELECT,DECRIBE,SHOW ... * 写操作:UPDATE,INSERT,DELETE ... * */ public static function isReadOperation($sql) { $sql = substr(ltrim($sql), 0, 10); $sql = str_ireplace(array('SELECT', 'SHOW', 'DESCRIBE', 'PRAGMA'), '^O^', $sql); //^O^,magic smile return strpos($sql, '^O^') === 0; } /** * 检测从服务器是否被标记 失败. */ private function _isDeadServer($c) { $cache = Yii::app()->{$this->cacheID}; if ($cache && $cache->get('DeadServer::' . $c) == 1) { return true; } return false; } /** * 标记失败的slaves. */ private function _markDeadServer($c) { $cache = Yii::app()->{$this->cacheID}; 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, 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', 'tablePrefix' => 'xcpt_', //表前缀 'enableSlave'=>true,//从数据库启用 'urgencyWrite'=>true,//紧急情况 主数据库无法连接 启用从数据库 写功能 'masterRead'=>true,//紧急情况 从数据库无法连接 启用主数据库 读功能 'slaves'=>array(//从数据库 array( //slave1 'connectionString'=>'mysql:host=localhost;dbname=db_xcpt', 'emulatePrepare' => true, 'username'=>'root', 'password'=>'root', 'charset' => 'utf8', 'tablePrefix' => 'xcpt_', //表前缀 ), array( //slave2 'connectionString'=>'mysql:host=localhost;dbname=db_xcpt', 'emulatePrepare' => true, 'username'=>'root', 'password'=>'root', 'charset' => 'utf8', 'tablePrefix' => 'xcpt_', //表前缀 ), ), ),

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

微信是主流的聊天工具之一,我們可以透過微信認識新的朋友,聯絡老的朋友,維繫朋友之間的友誼。正如天下沒有不散的宴席,人與人之間的相處難免會發生意見不合的時候。當一個人極度影響你的情緒,或是在相處的時候發現三觀不合,沒辦法再繼續溝通,那麼我們可能需要刪除微信好友的方法。怎麼刪除微信好友?刪除微信好友的方法第一步:在微信主介面輕觸【通訊錄】;第二步:點選對應要刪除的好友,進入【詳細資料】;第三步:點選右上角【...】;第四步:點選下方【刪除】即可;第五步:了解後頁面提示後,點選【刪除聯絡人】即可;溫馨

而後悔莫及、人們常常會因為一些原因不小心刪除某些聯絡人、微信作為一款廣泛使用的社群軟體。幫助用戶解決這個問題,本文將介紹如何透過簡單的方法找回被刪除的聯絡人。 1.了解微信聯絡人刪除機制這為我們找回被刪除的聯絡人提供了可能性、微信中的聯絡人刪除機制是將其從通訊錄中移除,但並未完全刪除。 2.使用微信內建「通訊錄恢復」功能微信提供了「通訊錄恢復」節省時間和精力,使用者可以透過此功能快速找回先前刪除的聯絡人,功能。 3.進入微信設定頁面點選右下角,開啟微信應用程式「我」再點選右上角設定圖示、進入設定頁面,,

七彩虹主機板在中國國內市場享有較高的知名度和市場佔有率,但是有些七彩虹主機板的用戶還不清楚怎麼進入bios進行設定呢?針對這一情況,小編專門為大家帶來了兩種進入七彩虹主機板bios的方法,快來試試吧!方法一:使用u盤啟動快捷鍵直接進入u盤裝系統七彩虹主機板一鍵啟動u盤的快捷鍵是ESC或F11,首先使用黑鯊裝機大師製作一個黑鯊U盤啟動盤,然後開啟電腦,當看到開機畫面的時候,連續按下鍵盤上的ESC或F11鍵以後將會進入到一個啟動項順序選擇的窗口,將遊標移到顯示“USB”的地方,然

番茄小說是一款非常熱門的小說閱讀軟體,我們在番茄小說中經常會有新的小說和漫畫可以去閱讀,每一本小說和漫畫都很有意思,很多小伙伴也想著要去寫小說來賺取賺取零用錢,在把自己想要寫的小說內容編輯成文字,那麼我們要怎麼樣在這裡面去寫小說呢?小伙伴們都不知道,那就讓我們一起到本站本站中花點時間來看寫小說的方法介紹。分享番茄小說寫小說方法教學 1、先在手機上打開番茄免費小說app,點擊個人中心——作家中心 2、跳到番茄作家助手頁面——點擊創建新書在小說的結

手機遊戲成為了人們生活中不可或缺的一部分,隨著科技的發展。它以其可愛的龍蛋形象和有趣的孵化過程吸引了眾多玩家的關注,而其中一款備受矚目的遊戲就是手機版龍蛋。幫助玩家們在遊戲中更好地培養和成長自己的小龍,本文將向大家介紹手機版龍蛋的孵化方法。 1.選擇合適的龍蛋種類玩家需要仔細選擇自己喜歡並且適合自己的龍蛋種類,根據遊戲中提供的不同種類的龍蛋屬性和能力。 2.提升孵化機的等級玩家需要透過完成任務和收集道具來提升孵化機的等級,孵化機的等級決定了孵化速度和孵化成功率。 3.收集孵化所需的資源玩家需要在遊戲中

Win11管理員權限取得方法匯總在Windows11作業系統中,管理員權限是非常重要的權限之一,可以讓使用者對系統進行各種操作。有時候,我們可能需要取得管理員權限來完成一些操作,例如安裝軟體、修改系統設定等。下面就為大家總結了一些取得Win11管理員權限的方法,希望能幫助大家。 1.使用快捷鍵在Windows11系統中,可以透過快捷鍵的方式快速開啟命令提

Oracle版本查詢方法詳解Oracle是目前世界上最受歡迎的關聯式資料庫管理系統之一,它提供了豐富的功能和強大的效能,廣泛應用於企業。在進行資料庫管理和開發過程中,了解Oracle資料庫的版本是非常重要的。本文將詳細介紹如何查詢Oracle資料庫的版本信息,並給出具體的程式碼範例。查詢資料庫版本的SQL語句在Oracle資料庫中,可以透過執行簡單的SQL語句

字體大小的設定成為了重要的個人化需求,隨著手機成為人們日常生活的重要工具。以滿足不同使用者的需求、本文將介紹如何透過簡單的操作,提升手機使用體驗,調整手機字體大小。為什麼需要調整手機字體大小-調整字體大小可以使文字更清晰易讀-適合不同年齡段用戶的閱讀需求-方便視力不佳的用戶使用手機系統自帶字體大小設置功能-如何進入系統設置界面-在在設定介面中找到並進入"顯示"選項-找到"字體大小"選項並進行調整第三方應用調整字體大小-下載並安裝支援字體大小調整的應用程式-開啟應用程式並進入相關設定介面-根據個人
