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

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

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

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

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

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

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

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

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

3.詳解

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

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

'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ù)庫(kù)連接。

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

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

'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ù)庫(kù)部署方式:0 集中式(單一服務(wù)器),1 分布式(主從服務(wù)器)
'DB_RW_SEPARATE'        =>  true,       // 數(shù)據(jù)庫(kù)讀寫(xiě)是否分離 主從式有效
'DB_MASTER_NUM'         =>  1, // 讀寫(xiě)分離后 主服務(wù)器數(shù)量
'DB_SLAVE_NO'           =>  '', // 指定從服務(wù)器序號(hào)

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

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

‘DB_HOST’

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

對(duì)于下面的用戶(hù)名和密碼還有監(jiān)聽(tīng)端口之類(lèi)的,當(dāng)然是有幾個(gè)就寫(xiě)幾個(gè)。如果各個(gè)數(shù)據(jù)庫(kù)的用戶(hù)名和密碼都一樣的話,可以只寫(xiě)一個(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)是在類(lèi) Think\Db\Dirver中

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

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

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

‘DB_RW_SEPARATE’=>true

true 表示讀寫(xiě)分離;false表示讀寫(xiě)不分離。

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

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

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

'DB_MASTER_NUM'=>1

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

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

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

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

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

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

'DB_SLAVE_NO'=> ''

指定從服務(wù)器的序號(hào),用于讀取數(shù)據(jù)。如果不設(shè)置,則根據(jù)主服務(wù)器的數(shù)量計(jì)算書(shū)從服務(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ù)庫(kù)
}

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

下面我們來(lái)看其連接的部分

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);

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

現(xiàn)在我們來(lái)看 $r == $m ? false : $db_master ,如果數(shù)據(jù)庫(kù)讀寫(xiě)不分離的情況下,讀寫(xiě)是一臺(tái)服務(wù)器的話 傳給connect函數(shù)的值為false?;蛘呤侨绻侵鲝姆蛛x的寫(xiě)的情況下傳給connect的值也為false。通過(guò)上面代碼我們看到,如果$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ù)處理語(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ì)于主從式來(lái)說(shuō),$r和$m肯定不會(huì)相同。因此如果說(shuō)在讀取數(shù)據(jù)的時(shí)候,選擇的那臺(tái)從服務(wù)器出現(xiàn)故障的話,那主服務(wù)器即是備用的,最后會(huì)去主服務(wù)器讀取。能保證數(shù)據(jù)讀取的時(shí)效性。

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

相關(guān)推薦:

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

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

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

以上是thinkphp 分布式數(shù)據(jù)庫(kù)詳解的詳細(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集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門(mén)話題

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

See all articles