亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

Yii實現MySQL多數據庫和讀寫分離實例分析

2024-05-04 23:28:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Yii實現MySQL多數據庫和讀寫分離的方法,以實例形式詳細的分析了Yii數據庫讀寫分離的方法,是開發大型項目非常實用的技巧,需要的朋友可以參考下
 
 

本文實例分析了Yii實現MySQL多數據庫和讀寫分離的方法。分享給大家供大家參考。具體分析如下:

Yii Framework是一個基于組件、用于開發大型 Web 應用的高性能 PHP 框架。Yii提供了今日Web 2.0應用開發所需要的幾乎一切功能,也是最強大的框架之一,下文我們來介紹Yii實現MySQL多庫和讀寫分離的方法

前段時間為SNS產品做了架構設計,在程序框架方面做了不少相關的壓力測試,最終選定了YiiFramework,至于為什么沒選用公司內部的 PHP框架,其實理由很充分,公司的框架雖然是"前輩"們辛苦的積累,但畢竟不夠成熟,沒有大型項目的歷練,猶如一個涉世未深的年輕小伙。Yii作為一個 頗有名氣開源產品,必定有很多人在使用,意味著有一批人在維護,而且在這之前,我也使用Yii開發過大型項目,Yii的設計模式和它的易擴展特性足以堪當重任。

SNS同一般的社交產品不同的就是它最終要承受大并發和大數據量的考驗,架構設計時就要考慮這些問題, web分布式、負載均衡、分布式文件存儲、MySQL分布式或讀寫分離、NoSQL以及各種緩存,這些都是必不可少的應用方案,本文所講的就是MySQL 分庫和主從讀寫分離在Yii的配置和使用。

Yii默認是不支持讀寫分離的,我們可以利用Yii的事件驅動模式來實現MySQL的讀寫分離。

Yii提供了一個強大的CActiveRecord數據庫操作類,通過重寫getDbConnection方法來實現數據庫的切換,然后通過事件 beforeSave、beforeDelete、beforeFind 來實現讀寫服務器的切換,還需要兩個配置文件dbconfig和modelconfig分別配置數據庫主從服務器和model所對應的數據庫名稱,附代碼
DBConfig.php文件如下:

復制代碼代碼如下:
<?php
return array(
'passport' => array(
'write' => array(
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=10.1.39.2;dbname=db1′,
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8′,
'schemaCachingDuration'=>3600,
),
'read' => array(
array(
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=10.1.39.3;dbname=db1,
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8′,
'schemaCachingDuration'=>3600,
),
array(
'class' => 'CDbConnection',
'connectionString' => 'mysql:host=10.1.39.4;dbname=db3′,
'emulatePrepare' => true,
//'enableParamLogging' => true,
'enableProfiling' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8′,
'schemaCachingDuration'=>3600,
),
),
),
);

ModelConfig.php如下:
復制代碼代碼如下:
<?php
return array(
//key為數據庫名稱,value為Model
'passport' => array('User','Post'),
'microblog' => array('…'),
);
?>

ActiveRecord.php如下:
復制代碼代碼如下:
/**
* 基于CActiveRecord類的封裝,實現多庫和主從讀寫分離
* 所有Model都必須繼承些類.
*
*/
class ActiveRecord extends CActiveRecord
{
//model配置
public $modelConfig = '';
//數據庫配置
public $dbConfig = '';
//定義一個多數據庫集合
static $dataBase = array();
//當前數據庫名稱
public $dbName = '';
//定義庫類型(讀或寫)
public $dbType = 'read'; //'read' or 'write'
/**
* 在原有基礎上添加了一個dbname參數
* @param string $scenario Model的應用場景
* @param string $dbname 數據庫名稱
*/
public function __construct($scenario='insert', $dbname = '')
{
if (!empty($dbname))
$this->dbName = $dbname;
parent::__construct($scenario);
}
/**
* 重寫父類的getDbConnection方法
* 多庫和主從都在這里切換
*/
public function getDbConnection()
{
//如果指定的數據庫對象存在則直接返回
if (self::$dataBase[$this->dbName]!==null)
return self::$dataBase[$this->dbName];
if ($this->dbName == 'db'){
self::$dataBase[$this->dbName] = Yii::app()->getDb();
}else{
$this->changeConn($this->dbType);
}
if(self::$dataBase[$this->dbName] instanceof CDbConnection){
self::$dataBase[$this->dbName]->setActive(true);
return self::$dataBase[$this->dbName];
} else
throw new CDbException(Yii::t('yii','Model requires a "db" CDbConnection application component.'));
}
/**
* 獲取配置文件
* @param unknown_type $type
* @param unknown_type $key
*/
private function getConfig($type="modelConfig",$key="){
$config = Yii::app()->params[$type];
if($key)
$config = $config[$key];
return $config;
}
/**
* 獲取數據庫名稱
*/
private function getDbName(){
if($this->dbName)
return $this->dbName;
$modelName = get_class($this->model());
$this->modelConfig = $this->getConfig('modelConfig');
//獲取model所對應的數據庫名
if($this->modelConfig)foreach($this->modelConfig as $key=>$val){
if(in_array($modelName,$val)){
$dbName = $key;
break;
}
}
return $dbName;
}
/**
* 切換數據庫連接
* @param unknown_type $dbtype
*/
protected function 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 == 'write'){
$config = $this->dbConfig[$dbtype];
}else{
$slavekey = array_rand($this->dbConfig[$dbtype]);
$config = $this->dbConfig[$dbtype][$slavekey];
}
//將數據庫配置加到component中
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];
} else
throw new CDbException(Yii::t('yii','Model requires a "changeConn" CDbConnection application component.'));
}
/**
* 保存數據前選擇 主 數據庫
*/
protected function beforeSave(){
parent::beforeSave();
$this->changeConn('write');
return true;
}
/**
* 刪除數據前選擇 主 數據庫
*/
protected function beforeDelete(){
parent::beforeDelete();
$this->changeConn('write');
return true;
}
/**
* 讀取數據選擇 從 數據庫
*/
protected function beforeFind(){
parent::beforeFind();
$this->changeConn('read');
return true;
}
/**
* 獲取master庫對象
*/
public function dbWrite(){
return $this->changeConn('write');
}
/**
* 獲取slave庫對象
*/
public function dbRead(){
return $this->changeConn('read');
}
}

 

這是我寫好的類,放在components文件夾里,然后所有的Model都繼承ActiveRecord類就可以實現多庫和主從讀寫分離了,至于如何支持原生的SQL也同時使用讀寫分離,此類都已經實現。

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩剧1988在线观看免费完整版| 亚洲成人精品视频在线观看| 久久精品99无色码中文字幕| 久久久免费精品视频| 国产精品久久久久久久久久久久久| 欧美日韩国产在线| 欧美日韩免费在线观看| 最新日韩中文字幕| 成人激情综合网| 亚洲国产精品va在线看黑人| 亚洲欧洲在线看| 国产成人av网址| 亚洲国产精久久久久久| 国产一区二区在线播放| 亚洲va欧美va国产综合久久| 亚洲国产精品va在线看黑人动漫| 中文字幕亚洲一区二区三区五十路| 九九热这里只有精品6| 欧美成人精品h版在线观看| 亚洲free性xxxx护士hd| 亚洲a∨日韩av高清在线观看| 精品一区二区三区四区| 日韩在线精品一区| 欧美性生交大片免网| 在线亚洲欧美视频| 97精品国产97久久久久久| 久久久久成人精品| 精品亚洲aⅴ在线观看| 这里只有精品丝袜| 亚洲欧美日韩精品久久亚洲区| 97久久久免费福利网址| 在线日韩欧美视频| 亚洲一区二区免费| 亚洲精品美女久久| 久久国内精品一国内精品| 在线精品视频视频中文字幕| 久久成人精品电影| 日本久久亚洲电影| 亚洲精品成人av| 国产精品扒开腿爽爽爽视频| 日韩网站免费观看| 午夜精品在线观看| 欧美黑人一区二区三区| 日韩欧美极品在线观看| 久久理论片午夜琪琪电影网| 国产午夜精品美女视频明星a级| 久久久久久一区二区三区| 亚洲电影免费观看高清完整版| 精品国产一区二区三区久久| 久久夜色撩人精品| 国产91精品久久久久久久| 上原亚衣av一区二区三区| 国产精品久久精品| 亚洲精品一区在线观看香蕉| 美日韩在线视频| 欧美一级大片视频| 国产欧美精品一区二区三区介绍| 国产欧美最新羞羞视频在线观看| 欧美一区二区三区精品电影| 91精品视频专区| 欧美老女人bb| 国产拍精品一二三| 最新91在线视频| 欧美电影院免费观看| 久久久久久久久国产| 成人黄在线观看| 91av国产在线| 国产精品激情av电影在线观看| 欧美裸体xxxx极品少妇| 国产成人精品视| 欧美大片在线看免费观看| 欧美午夜激情在线| 91亚洲精华国产精华| 国产精品18久久久久久麻辣| 激情亚洲一区二区三区四区| 青草青草久热精品视频在线网站| 中文字幕在线看视频国产欧美| 国产精品普通话| 久久久亚洲福利精品午夜| 日本精品va在线观看| 亚洲xxx大片| 欧美日本国产在线| 亚洲图片制服诱惑| 欧美午夜激情视频| 91精品国产高清久久久久久| 亚洲国产欧美一区二区三区同亚洲| 91亚洲国产成人精品性色| 久久精品成人欧美大片古装| 国产精品免费在线免费| 亚洲美女自拍视频| 日韩激情片免费| 97久久精品视频| 国产精品福利观看| 国产欧美 在线欧美| 高清欧美性猛交xxxx黑人猛交| 亚洲人a成www在线影院| 精品久久久久久久久久| 亚洲大胆人体视频| 亚洲色图av在线| 久久综合久久八八| 久久精品久久久久电影| 中文字幕亚洲情99在线| 亚洲第一福利在线观看| 国产精品video| 国产精品久久激情| 国产精品一区二区久久精品| 欧美日本精品在线| 欧美日韩免费看| 国产成人综合一区二区三区| 日韩av第一页| 日韩精品有码在线观看| 视频在线观看99| 亚洲专区中文字幕| 51ⅴ精品国产91久久久久久| 国产精品扒开腿做爽爽爽的视频| 秋霞成人午夜鲁丝一区二区三区| 中文字幕亚洲欧美日韩高清| 欧美黄色www| 国产成人精品视频在线观看| 日韩视频免费大全中文字幕| 成人有码在线播放| 91香蕉国产在线观看| 97国产一区二区精品久久呦| 欧美三级免费观看| 亚洲日韩中文字幕在线播放| 45www国产精品网站| 亚洲一区二区三区在线视频| 都市激情亚洲色图| 久久亚洲成人精品| 亚洲aⅴ男人的天堂在线观看| 亚洲美女又黄又爽在线观看| 欧美性开放视频| 亚洲xxx大片| 欧美一级高清免费播放| 这里只有精品丝袜| 最近2019中文字幕一页二页| 国产精品久久久久不卡| 欧美日韩高清在线观看| 国产精品久久久久9999| 久久精品国产免费观看| 欧美日韩一区二区在线播放| 欧洲成人性视频| 中文字幕成人精品久久不卡| 欧美夫妻性生活视频| 亚洲欧美日韩综合| 欧美日韩亚洲国产一区| 亚洲女人天堂色在线7777| 欧美一区二区三区精品电影| 91免费精品视频| 国产婷婷97碰碰久久人人蜜臀| 日韩中文字幕免费| 国产一区二区三区网站| 日韩精品中文字幕视频在线| 麻豆国产va免费精品高清在线| 91久久精品在线| 亚洲精品久久久久久久久| 欧美日韩在线一区| 亚洲成人激情图| 亚洲第一中文字幕| 欧美日韩国产精品一区二区不卡中文| 人人爽久久涩噜噜噜网站| 日韩成人在线网站| 777午夜精品福利在线观看| 亚洲理论在线a中文字幕|