首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP 資料庫連線與主從分離讀寫分離配置教學

     編輯:PHP 綜合知識

ThinkPHP 支援多資料庫連線、分散式部署與讀寫分離,適當配置能大幅提升高併發系統的資料庫承載能力。本文詳細說明單庫、多庫、主從架構配置方法。

基礎單庫配置

// 專案根目錄 config.php (共用)
 'mysql',
    'DB_HOST'   => 'localhost',
    'DB_NAME'   => 'aoli',
    'DB_USER'   => 'root',
    'DB_PWD'    => '',
    'DB_PREFIX' => '',
    'DB_CHARSET'=> 'utf8',
    'DB_PORT'   => '3306',
];

模組獨立配置合併

// Home/Conf/config.php
 2, // 前台用 REWRITE
], $common);
// Admin/Conf/config.php
 1, // 後台用普通模式
], $common);

主從分離 / 讀寫分離配置

// 適用高併發、大流量專案
return [
    'DB_TYPE'          => 'mysql',
    'DB_HOST'          => 'localhost,192.168.1.2',      // 多主機,逗號分隔
    'DB_PORT'          => '3306',
    'DB_NAME'          => 'thinkphptest',               // 同名資料庫,不同名則一一對應
    'DB_USER'          => 'root',
    'DB_PWD'           => 'password',
    'DB_PREFIX'        => 'think_',
    'DB_CHARSET'       => 'utf8',
    
    // 核心:啟用分散式資料庫
    'DB_DEPLOY_TYPE'   => 1,        // 1=分散式
    'DB_RW_SEPARATE'   => true,     // 讀寫分離
    // 第一台為 Master (寫入),其餘為 Slave (唯讀)
    'DB_MASTER_NUM'    => 1,        // Master 數量 (預設 1)
    'DB_SLAVE_NO'      => '',       // 指定 Slave 序號讀取,空=隨機輪詢
];

架構原理圖解

應用層
    ↓
ThinkPHP Db 類
    ↓
┌─────────────────────┐
│  寫入操作 (INSERT/UPDATE/DELETE)  │
│         ↓                    │
│   Master (DB_HOST[0])         │
└─────────────────────┘
    ↓
┌─────────────────────┐
│  讀取操作 (SELECT)              │
│         ↓                    │
│   Slave (DB_HOST[1...N])      │
│   隨機/輪詢/指定 Slave        │
└─────────────────────┘

Controller 中讀取配置驗證

public function testDbConfig() {
    $host = C('DB_HOST');  // 陣列或字串
    $prefix = C('DB_PREFIX');
    $this->assign('host', $host);
    $this->assign('prefix', $prefix);
    $this->display();
}

關鍵注意事項

項目說明
資料同步Master→Slave 複寫延遲可能導致讀到舊資料,關鍵業務 (付款後查訂單) 應強制讀 Master。
強制讀 MasterM('User')->master()->find(1) 或 DB::query(..., [], true) 最後一參數 true 表示 Master。
事務處理事務必須在 Master 執行,ThinkPHP startTrans() 會自動切換至 Master。
連線池持久連線 PDO::ATTR_PERSISTENT 配合主從需謹慎,避免連線洩漏。
單點故障Master 掛掉寫入不可用;建議雙 Master (MHA、Galera Cluster) 或 ProxySQL 自動故障轉移。

進階:自訂 Slave 選擇策略

// 擴充 Db 類別,實作加權輪詢、延遲感知等策略
class MyDb extends Db {
    protected function _getSlave() {
        // 自訂邏輯:根據權重、延遲、負載選擇 Slave
        return $this->_linkID[self::$config['DB_HOST'][1]]; // 示例
    }
}

主從分離是資料庫擴展的經典模式,ThinkPHP 內建支援降低了接入門檻,但**資料一致性、故障轉移、監控告警**仍需架構層面完整規劃。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved