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 │
└─────────────────────┘
public function testDbConfig() {
$host = C('DB_HOST'); // 陣列或字串
$prefix = C('DB_PREFIX');
$this->assign('host', $host);
$this->assign('prefix', $prefix);
$this->display();
}
| 項目 | 說明 |
|---|---|
| 資料同步 | Master→Slave 複寫延遲可能導致讀到舊資料,關鍵業務 (付款後查訂單) 應強制讀 Master。 |
| 強制讀 Master | M('User')->master()->find(1) 或 DB::query(..., [], true) 最後一參數 true 表示 Master。 |
| 事務處理 | 事務必須在 Master 執行,ThinkPHP startTrans() 會自動切換至 Master。 |
| 連線池 | 持久連線 PDO::ATTR_PERSISTENT 配合主從需謹慎,避免連線洩漏。 |
| 單點故障 | Master 掛掉寫入不可用;建議雙 Master (MHA、Galera Cluster) 或 ProxySQL 自動故障轉移。 |
// 擴充 Db 類別,實作加權輪詢、延遲感知等策略
class MyDb extends Db {
protected function _getSlave() {
// 自訂邏輯:根據權重、延遲、負載選擇 Slave
return $this->_linkID[self::$config['DB_HOST'][1]]; // 示例
}
}
主從分離是資料庫擴展的經典模式,ThinkPHP 內建支援降低了接入門檻,但**資料一致性、故障轉移、監控告警**仍需架構層面完整規劃。