国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 thinkphp 分布式數(shù)據(jù)庫詳解

thinkphp 分布式數(shù)據(jù)庫詳解

Jun 15, 2018 am 11:36 AM
thinkphp 數(shù)據(jù)庫

1.分布式數(shù)據(jù)庫是什么:

  tp的分布式數(shù)據(jù)庫主要是通過該配置:

  'DB_DEPLOY_TYPE'??????? =>? 1,// 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器)

2.主從服務(wù)器的讀寫分離是什么:

?  主從數(shù)據(jù)庫即為一個(gè)主數(shù)據(jù)庫會(huì)有對(duì)應(yīng)n個(gè)從數(shù)據(jù)庫,而從數(shù)據(jù)庫只能有一個(gè)對(duì)應(yīng)的從數(shù)據(jù)庫。主從數(shù)據(jù)庫中寫的操作需要使用主數(shù)據(jù)庫,而讀操作使用從數(shù)據(jù)庫。主數(shù)據(jù)庫與從數(shù)據(jù)庫始終保持?jǐn)?shù)據(jù)一致性。其中保持?jǐn)?shù)據(jù)庫一致的原理即為當(dāng)主數(shù)據(jù)庫數(shù)據(jù)發(fā)生變化時(shí),會(huì)將操作寫入到主數(shù)據(jù)庫日志中,而從數(shù)據(jù)庫會(huì)不停的讀取主數(shù)據(jù)庫的日志保存到自己的日志系統(tǒng)中,然后進(jìn)行執(zhí)行,從而保持了主從數(shù)據(jù)庫一致。

3.詳解

一、單一數(shù)據(jù)庫的連接

在使用的時(shí)候,單一數(shù)據(jù)庫的連接配置非常簡單。我們只需要在配置文件中配置一下的信息即可。

'DB_TYPE' => 'mysql',
'DB_HOST' => '192.168.5.102',
'DB_NAME' => 'databasename',
'DB_USER' => 'user',
'DB_PWD' => 'password',
'DB_PORT' => '3306',
'DB_PREFIX' => 'onmpw_',

設(shè)置完成以后就可以使用了。默認(rèn)情況下就是單一的數(shù)據(jù)庫連接。

二、分布式數(shù)據(jù)庫的連接

單一數(shù)據(jù)庫的連接很簡單,我們著重分析一下分布式數(shù)據(jù)庫的連接。

'DB_TYPE' => 'mysql',
'DB_HOST' => '192.168.5.191,192.168.5.88,192.168.5.103',
'DB_NAME' => 'test,test,test',
'DB_USER' => 'masteruser,slaveuser,slaveuser',
'DB_PWD' => 'masterpass,slavepass,slavepass',
'DB_PORT' => '3306',
'DB_PREFIX' => '',
'DB_DEPLOY_TYPE'        =>  1, // 數(shù)據(jù)庫部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器)
'DB_RW_SEPARATE'        =>  true,       // 數(shù)據(jù)庫讀寫是否分離 主從式有效
'DB_MASTER_NUM'         =>  1, // 讀寫分離后 主服務(wù)器數(shù)量
'DB_SLAVE_NO'           =>  '', // 指定從服務(wù)器序號(hào)

按照以上配置就可以連接分布式數(shù)據(jù)庫了。

下面我們看下面幾個(gè)選項(xiàng)

‘DB_HOST’

分布式數(shù)據(jù)庫,有幾臺(tái)服務(wù)器就要填寫幾個(gè)服務(wù)器地址,每個(gè)地址之間用逗號(hào)隔開。如果是主從式分布的話,前面的地址要是主數(shù)據(jù)庫的地址。

對(duì)于下面的用戶名和密碼還有監(jiān)聽端口之類的,當(dāng)然是有幾個(gè)就寫幾個(gè)。如果各個(gè)數(shù)據(jù)庫的用戶名和密碼都一樣的話,可以只寫一個(gè)。

對(duì)于這些選項(xiàng)的解析的代碼如下

$_config['username']  =   explode(',',$this->config['username']);
$_config['password']  =   explode(',',$this->config['password']);
$_config['hostname']  =   explode(',',$this->config['hostname']);
$_config['hostport']   =   explode(',',$this->config['hostport']);
$_config['database']  =   explode(',',$this->config['database']);
$_config['dsn']      =   explode(',',$this->config['dsn']);
$_config['charset']   =   explode(',',$this->config['charset']);

‘DB_DEPLOY_TYPE’=>1

1 表示是分布式, 0 表示的是集中式(也就是單一服務(wù)器)。

該選項(xiàng)的實(shí)現(xiàn)是在類 Think\Db\Dirver中

protected function initConnect($master=true) {
    if(!empty($this->config['deploy']))
       // 采用分布式數(shù)據(jù)庫
       $this->_linkID = $this->multiConnect($master);
    else
       // 默認(rèn)單數(shù)據(jù)庫
       if ( !$this->_linkID ) $this->_linkID = $this->connect();
}

$this->config[‘deploy’]表示的就是’DB_DEPLOY_TYPE’這個(gè)配置選項(xiàng),上面的配置在使用之前都已經(jīng)經(jīng)過解析了,配置項(xiàng)都在$this->config數(shù)組中。至于是如何解析配置文件的,這里我們不做介紹,感興趣的可以參考Think\Db類。

$this->multiConnect()函數(shù)就是用來進(jìn)行分布式連接的,如果’DB_DEPLOY_TYPE’選項(xiàng)設(shè)置為1,該函數(shù)就會(huì)執(zhí)行。否則直接執(zhí)行$this->connect()函數(shù)。

‘DB_RW_SEPARATE’=>true

true 表示讀寫分離;false表示讀寫不分離。

這里需要注意的是,讀寫分離是以主從式數(shù)據(jù)庫系統(tǒng)為前提的。該選項(xiàng)設(shè)置為true的時(shí)候主數(shù)據(jù)庫寫,從數(shù)據(jù)庫讀。

if($this->config['rw_separate']){
      // 主從式采用讀寫分離
      if($master)
          // 主服務(wù)器寫入
          $r  =   $m;
      else{
          if(is_numeric($this->config['slave_no'])) {// 指定服務(wù)器讀
              $r = $this->config['slave_no'];
          }else{
               // 讀操作連接從服務(wù)器
              $r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1));   // 每次隨機(jī)連接的數(shù)據(jù)庫
          }
            }
}else{
      // 讀寫操作不區(qū)分服務(wù)器
      $r = floor(mt_rand(0,count($_config['hostname'])-1));   // 每次隨機(jī)連接的數(shù)據(jù)庫
}

$this->config[‘rw_separate’] 為true的時(shí)候采用讀寫分離,為false的時(shí)候讀寫不分離。讀寫分離為什么必須是主從式的呢?因?yàn)閺姆?wù)器不能寫只能讀,如果向從服務(wù)器寫入數(shù)據(jù)的話,數(shù)據(jù)是沒法同步的。這樣就會(huì)造成數(shù)據(jù)不一致的情況。所以說,如果我們的系統(tǒng)是主從式的話,我們必須采用讀寫分離。也就是說DB_RW_SEPARATE選項(xiàng)必須配置為true。

'DB_MASTER_NUM'=>1

該選項(xiàng)后面的數(shù)字表示讀寫分離后,主服務(wù)器的數(shù)量。因此該選項(xiàng)也是用于主從式數(shù)據(jù)庫系統(tǒng)。

下面的代碼是選擇主服務(wù)器。

$m = floor(mt_rand(0,$this->config['master_num']-1));

主從式數(shù)據(jù)庫讀取的時(shí)候選擇從服務(wù)器讀的核心代碼

$r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1)); // 每次隨機(jī)連接的數(shù)據(jù)庫

其中$this->config[‘master_num’]表示主服務(wù)器的數(shù)量。

'DB_SLAVE_NO'=> ''

指定從服務(wù)器的序號(hào),用于讀取數(shù)據(jù)。如果不設(shè)置,則根據(jù)主服務(wù)器的數(shù)量計(jì)算書從服務(wù)器的數(shù)量,然后從中隨機(jī)選取一臺(tái)進(jìn)行讀取。

if(is_numeric($this->config['slave_no'])) {// 指定服務(wù)器讀
$r = $this->config['slave_no'];
}else{
// 讀操作連接從服務(wù)器
$r = floor(mt_rand($this->config['master_num'],count($_config['hostname'])-1)); // 每次隨機(jī)連接的數(shù)據(jù)庫
}

以上是對(duì)每個(gè)選項(xiàng)的作用的實(shí)現(xiàn)代碼進(jìn)行了一個(gè)簡單的說明。

下面我們來看其連接的部分

if($m != $r ){
   $db_master  =  array(
      'username' =>  isset($_config['username'][$m])?$_config['username'][$m]:$_config['username'][0],
      'password'  =>  isset($_config['password'][$m])?$_config['password'][$m]:$_config['password'][0],
      'hostname'  =>  isset($_config['hostname'][$m])?$_config['hostname'][$m]:$_config['hostname'][0],
      'hostport'  =>  isset($_config['hostport'][$m])?$_config['hostport'][$m]:$_config['hostport'][0],
      'database'  =>  isset($_config['database'][$m])?$_config['database'][$m]:$_config['database'][0],
      'dsn'  =>  isset($_config['dsn'][$m])?$_config['dsn'][$m]:$_config['dsn'][0],
      'charset'  =>  isset($_config['charset'][$m])?$_config['charset'][$m]:$_config['charset'][0],
    );
}
$db_config = array(
   'username'  =>  isset($_config['username'][$r])?$_config['username'][$r]:$_config['username'][0],
    'password'  =>  isset($_config['password'][$r])?$_config['password'][$r]:$_config['password'][0],
    'hostname'  =>  isset($_config['hostname'][$r])?$_config['hostname'][$r]:$_config['hostname'][0],
    'hostport'  =>  isset($_config['hostport'][$r])?$_config['hostport'][$r]:$_config['hostport'][0],
     'database'  =>  isset($_config['database'][$r])?$_config['database'][$r]:$_config['database'][0],
     'dsn'  =>  isset($_config['dsn'][$r])?$_config['dsn'][$r]:$_config['dsn'][0],
     'charset'   =>  isset($_config['charset'][$r])?$_config['charset'][$r]:$_config['charset'][0],
);
return $this->connect($db_config,$r,$r == $m ? false : $db_master);

看到這,我覺得大家應(yīng)該對(duì)上面在介紹各個(gè)配置選項(xiàng)的代碼的時(shí)候其中的$r和$m是什么作用了。

現(xiàn)在我們來看 $r == $m ? false : $db_master ,如果數(shù)據(jù)庫讀寫不分離的情況下,讀寫是一臺(tái)服務(wù)器的話 傳給connect函數(shù)的值為false?;蛘呤侨绻侵鲝姆蛛x的寫的情況下傳給connect的值也為false。通過上面代碼我們看到,如果$r和$m不相等的情況下,會(huì)設(shè)置$db_master。其實(shí)也就是相當(dāng)于一臺(tái)備用的,如果選擇的$r服務(wù)器出現(xiàn)故障不能連接,將會(huì)去連接$db_master。

connect()函數(shù)的第三個(gè)參數(shù)其實(shí)是表示當(dāng)$db_config這臺(tái)服務(wù)器連接故障時(shí)是否選擇備用的連接。false表示不重連,其它值即表示重新連接。

其核心代碼如下

try{
   if(empty($config['dsn'])) {
      $config['dsn']  =   $this->parseDsn($config);
   }
   if(version_compare(PHP_VERSION,&#39;5.3.6&#39;,&#39;<=&#39;)){
       // 禁用模擬預(yù)處理語句
       $this->options[PDO::ATTR_EMULATE_PREPARES]  =   false;
   }
   $this->linkID[$linkNum] = new PDO( $config[&#39;dsn&#39;], $config[&#39;username&#39;], $config[&#39;password&#39;],$this->options);
}catch (\PDOException $e) {
   if($autoConnection){ //$autoConnection不為false,而是默認(rèn)的主服務(wù)器
        trace($e->getMessage(),&#39;&#39;,&#39;ERR&#39;);
            return $this->connect($autoConnection,$linkNum);  //出現(xiàn)異常,使用遞歸函數(shù)重新連接
        }elseif($config[&#39;debug&#39;]){
            E($e->getMessage());
    }
}

這種方式,對(duì)于主從式來說,$r和$m肯定不會(huì)相同。因此如果說在讀取數(shù)據(jù)的時(shí)候,選擇的那臺(tái)從服務(wù)器出現(xiàn)故障的話,那主服務(wù)器即是備用的,最后會(huì)去主服務(wù)器讀取。能保證數(shù)據(jù)讀取的時(shí)效性。

本文講解了thinkphp 分布式數(shù)據(jù)庫詳解,更多相關(guān)內(nèi)容請(qǐng)關(guān)注php中文網(wǎng)。

相關(guān)推薦:

如何通過ThinkPHP鏈接數(shù)據(jù)庫

如何通過thinkphp連接多數(shù)據(jù)庫

關(guān)于ThinkPHP 5.數(shù)據(jù)庫的一些基本操作

以上是thinkphp 分布式數(shù)據(jù)庫詳解的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

iOS 18 新增'已恢復(fù)”相冊(cè)功能 可找回丟失或損壞的照片 iOS 18 新增'已恢復(fù)”相冊(cè)功能 可找回丟失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發(fā)布的iOS18、iPadOS18以及macOSSequoia系統(tǒng)為Photos應(yīng)用增添了一項(xiàng)重要功能,旨在幫助用戶輕松恢復(fù)因各種原因丟失或損壞的照片和視頻。這項(xiàng)新功能在Photos應(yīng)用的"工具"部分引入了一個(gè)名為"已恢復(fù)"的相冊(cè),當(dāng)用戶設(shè)備中存在未納入其照片庫的圖片或視頻時(shí),該相冊(cè)將自動(dòng)顯示。"已恢復(fù)"相冊(cè)的出現(xiàn)為因數(shù)據(jù)庫損壞、相機(jī)應(yīng)用未正確保存至照片庫或第三方應(yīng)用管理照片庫時(shí)照片和視頻丟失提供了解決方案。用戶只需簡單幾步

如何在 Golang 中將 JSON 數(shù)據(jù)保存到數(shù)據(jù)庫中? 如何在 Golang 中將 JSON 數(shù)據(jù)保存到數(shù)據(jù)庫中? Jun 06, 2024 am 11:24 AM

可以通過使用gjson庫或json.Unmarshal函數(shù)將JSON數(shù)據(jù)保存到MySQL數(shù)據(jù)庫中。gjson庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數(shù)需要一個(gè)目標(biāo)類型指針來解組JSON數(shù)據(jù)。這兩種方法都需要準(zhǔn)備SQL語句和執(zhí)行插入操作來將數(shù)據(jù)持久化到數(shù)據(jù)庫中。

在PHP中使用MySQLi建立數(shù)據(jù)庫連接的詳盡教程 在PHP中使用MySQLi建立數(shù)據(jù)庫連接的詳盡教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立數(shù)據(jù)庫連接:包含MySQLi擴(kuò)展(require_once)創(chuàng)建連接函數(shù)(functionconnect_to_db)調(diào)用連接函數(shù)($conn=connect_to_db())執(zhí)行查詢($result=$conn->query())關(guān)閉連接($conn->close())

mysql:簡單的概念,用于輕松學(xué)習(xí) mysql:簡單的概念,用于輕松學(xué)習(xí) Apr 10, 2025 am 09:29 AM

MySQL是一個(gè)開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。1)創(chuàng)建數(shù)據(jù)庫和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高級(jí)操作:JOIN、子查詢和事務(wù)處理。4)調(diào)試技巧:檢查語法、數(shù)據(jù)類型和權(quán)限。5)優(yōu)化建議:使用索引、避免SELECT*和使用事務(wù)。

如何在PHP中處理數(shù)據(jù)庫連接錯(cuò)誤 如何在PHP中處理數(shù)據(jù)庫連接錯(cuò)誤 Jun 05, 2024 pm 02:16 PM

PHP中處理數(shù)據(jù)庫連接報(bào)錯(cuò),可以使用以下步驟:使用mysqli_connect_errno()獲取錯(cuò)誤代碼。使用mysqli_connect_error()獲取錯(cuò)誤消息。通過捕獲并記錄這些錯(cuò)誤信息,可以輕松識(shí)別并解決數(shù)據(jù)庫連接問題,確保應(yīng)用程序的順暢運(yùn)行。

甲骨文在商業(yè)世界中的作用 甲骨文在商業(yè)世界中的作用 Apr 23, 2025 am 12:01 AM

Oracle不僅是數(shù)據(jù)庫公司,還是云計(jì)算和ERP系統(tǒng)的領(lǐng)導(dǎo)者。1.Oracle提供從數(shù)據(jù)庫到云服務(wù)和ERP系統(tǒng)的全面解決方案。2.OracleCloud挑戰(zhàn)AWS和Azure,提供IaaS、PaaS和SaaS服務(wù)。3.Oracle的ERP系統(tǒng)如E-BusinessSuite和FusionApplications幫助企業(yè)優(yōu)化運(yùn)營。

MySQL:世界上最受歡迎的數(shù)據(jù)庫的簡介 MySQL:世界上最受歡迎的數(shù)據(jù)庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),主要用于快速、可靠地存儲(chǔ)和檢索數(shù)據(jù)。其工作原理包括客戶端請(qǐng)求、查詢解析、執(zhí)行查詢和返回結(jié)果。使用示例包括創(chuàng)建表、插入和查詢數(shù)據(jù),以及高級(jí)功能如JOIN操作。常見錯(cuò)誤涉及SQL語法、數(shù)據(jù)類型和權(quán)限問題,優(yōu)化建議包括使用索引、優(yōu)化查詢和分表分區(qū)。

laravel和thinkphp的區(qū)別 laravel和thinkphp的區(qū)別 Apr 18, 2025 pm 01:09 PM

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發(fā)中各有優(yōu)缺點(diǎn)。本文將深入比較這兩者,重點(diǎn)介紹它們的架構(gòu)、特性和性能差異,以幫助開發(fā)者根據(jù)其特定項(xiàng)目需求做出明智的選擇。

See all articles