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

首頁 後端開發(fā) php教程 thinkphp 分散式資料庫詳解

thinkphp 分散式資料庫詳解

Jun 15, 2018 am 11:36 AM
thinkphp 資料庫

1.分散式資料庫是什麼:

  tp的分散式資料庫主要是透過此配置:

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

2.主從伺服器的讀寫分離是什麼:

?  主從資料庫即為一個主資料庫會有對應(yīng)n個從資料庫,而從資料庫只能有一個對應(yīng)的從資料庫。主從資料庫寫的操作需要使用主資料庫,而讀操作使用從資料庫。主資料庫與從資料庫始終保持資料一致性。其中保持資料庫一致的原理即為當(dāng)主資料庫資料變更時,會將操作寫入到主資料庫日誌中,而從資料庫會不停的讀取主資料庫的日誌儲存到自己的日誌系統(tǒng)中,然後執(zhí)行,從而保持了主從資料庫一致。

3.詳解

一、單一資料庫的連接

在使用的時候,單一資料庫的連線配置非常簡單。我們只需要在設(shè)定檔中配置一下的資訊。

'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è)定完成以後就可以使用了。預(yù)設(shè)就是單一的資料庫連線。

二、分散式資料庫的連接

單一資料庫的連接很簡單,我們將重點放在分析一下分散式資料庫的連接。

'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ù)器序號

依照上述配置就可以連接分散式資料庫了。

下面我們看下面幾個選項

'DB_HOST'

#分散式資料庫,有幾臺伺服器就要填寫幾個伺服器位址,每個地址之間用逗號隔開。如果是主從式分佈的話,前面的位址要是主資料庫的位址。

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

對于這些選項的解析的代碼如下

$_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à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’這個配置選項,上面的配置在使用之前都已經(jīng)經(jīng)過解析了,配置項都在$this->config數(shù)組中。至于是如何解析配置文件的,這里我們不做介紹,感興趣的可以參考Think\Db類。

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

‘DB_RW_SEPARATE’=>true

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

這里需要注意的是,讀寫分離是以主從式數(shù)據(jù)庫系統(tǒng)為前提的。該選項設(shè)置為true的時候主數(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));   // 每次隨機連接的數(shù)據(jù)庫
          }
            }
}else{
      // 讀寫操作不區(qū)分服務(wù)器
      $r = floor(mt_rand(0,count($_config['hostname'])-1));   // 每次隨機連接的數(shù)據(jù)庫
}

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

'DB_MASTER_NUM'=>1

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

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

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

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

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

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

'DB_SLAVE_NO'=> ''

指定從服務(wù)器的序號,用于讀取數(shù)據(jù)。如果不設(shè)置,則根據(jù)主服務(wù)器的數(shù)量計算書從服務(wù)器的數(shù)量,然后從中隨機選取一臺進(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)); // 每次隨機連接的數(shù)據(jù)庫
}

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

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

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)該對上面在介紹各個配置選項的代碼的時候其中的$r和$m是什么作用了。

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

connect()函數(shù)的第三個參數(shù)其實是表示當(dāng)$db_config這臺服務(wù)器連接故障時是否選擇備用的連接。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());
    }
}

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

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

相關(guān)推薦:

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

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

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

以上是thinkphp 分散式資料庫詳解的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

iOS 18 新增「已復(fù)原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復(fù)原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

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

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

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

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

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

在PHP中使用MySQLi建立資料庫連線的詳盡教學(xué) 在PHP中使用MySQLi建立資料庫連線的詳盡教學(xué) Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴(kuò)充(require_once)建立連線函數(shù)(functionconnect_to_db)呼叫連線函數(shù)($conn=connect_to_db())執(zhí)行查詢($result=$conn->query())關(guān)閉連線( $conn->close())

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應(yīng)用程式的順暢運作。

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

Oracle不僅是數(shù)據(jù)庫公司,還是雲(yún)計算和ERP系統(tǒng)的領(lǐng)導(dǎo)者。 1.Oracle提供從數(shù)據(jù)庫到雲(yún)服務(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)化運營。

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

MySQL是一種開源的關(guān)係型數(shù)據(jù)庫管理系統(tǒng),主要用於快速、可靠地存儲和檢索數(shù)據(jù)。其工作原理包括客戶端請求、查詢解析、執(zhí)行查詢和返回結(jié)果。使用示例包括創(chuàng)建表、插入和查詢數(shù)據(jù),以及高級功能如JOIN操作。常見錯誤涉及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)缺點。本文將深入比較這兩者,重點介紹它們的架構(gòu)、特性和性能差異,以幫助開發(fā)者根據(jù)其特定項目需求做出明智的選擇。

See all articles