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

CodeIgniter 多資料庫連線配置與切換完整教學

     編輯:PHP 綜合知識

應用場景

單一應用需連接多個資料庫:主庫、訂單庫、查詢庫、日誌庫等,需在執行期動態切換。

配置檔修改:application/config/database.php

1. 關閉持久連線(關鍵)

所有資料庫群組將 pconnect 設為 FALSE,避免連線衝突:

$db['default']['pconnect'] = FALSE;
$db['bbs']['pconnect'] = FALSE;
// ... 其他群組同理

2. 定義多個資料庫群組

// 預設群組
$db['default'] = [
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'main_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => 'cg_',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'autoinit' => TRUE,
    'stricton' => FALSE,
];

// 第二群組:論壇/訂單資料庫
$db['bbs'] = [
    'hostname' => '192.168.1.100',
    'username' => 'bbs_user',
    'password' => 'bbs_pass',
    'database' => 'bbs_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => 'bbs_',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'autoinit' => TRUE,
    'stricton' => FALSE,
];

// 可繼續新增 db_query、db_log 等群組...

控制器中載入與使用

建構函數載入指定群組

class Order extends CI_Controller {
    public function __construct() {
        parent::__construct();
        // 載入 'bbs' 群組,第二參數 TRUE 回傳 DB 物件實例
        $this->bbs = $this->load->database('bbs', TRUE);
    }

    public function index() {
        // 使用 $this->bbs 操作
        $query = $this->bbs->query("SELECT * FROM orders WHERE user_id = 123");
        $orders = $query->result();
        $this->load->view('order_list', ['orders' => $orders]);
    }
}

模型中使用特定連線

class Order_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->bbs_db = $this->load->database('bbs', TRUE);
    }

    public function getUserOrders($userId) {
        return $this->bbs_db
            ->select('id, amount, status, created_at')
            ->from('orders')
            ->where('user_id', $userId)
            ->get()
            ->result();
    }
}

進階:動態切換連線

public function switchDb($group) {
    // 手動切換預設連線
    $this->db = $this->load->database($group, TRUE);
    // 後續 $this->db 操作即為新連線
}

常見問題與解決

問題原因解決
多資料庫查詢報錯pconnect=TRUE 導致連線共用衝突全部設為 FALSE
模型無法存取 $this->db模型預設使用 default 群組建構函數載入需求群組賦值給屬性
跨資料庫交易CI 不支援跨連線交易業務層面補償交易、或合併至同一資料庫
字元編碼亂碼各群組 char_set 不一致統一設定 utf8/utf8mb4

CI 4 多資料庫配置

// app/Config/Database.php
public $default = [ ... ];
public $bbs = [
    'hostname' => '192.168.1.100',
    'database' => 'bbs_db',
    'username' => 'bbs_user',
    'password' => 'bbs_pass',
    'DBDriver' => 'MySQLi',
    'DBPrefix' => 'bbs_',
    // ...
];

// 控制器使用
$db = \Config\Database::connect('bbs');
$orders = $db->table('orders')->where('user_id', 123)->get()->getResult();

最佳實踐建議

  1. 群組命名語意化:default、orders、logs、analytics。
  2. 集中管理連線資訊:敏感密碼使用環境變數 getenv('DB_ORDERS_PASS')。
  3. 連線池監控:避免過多閒置連線佔用資源,autoinit=FALSE 按需連線。
  4. 讀寫分離:主庫寫入、從庫讀取,配置兩個群組並在 Model/Service 層路由。
  5. 統一錯誤處理:建立基底 Model 封裝共用查詢邏輯與例外處理。

CodeIgniter 透過 database.php 多群組配置與 $this->load->database('group', TRUE) 即可輕鬆實現多資料庫切換,關鍵在於關閉持久連線並妥善管理連線實例。

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