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

CodeIgniter database.php 多資料庫配置與連線管理最佳實踐

     編輯:PHP 綜合知識

配置檔結構解析

$active_group = 'default';  // 預設群組
$active_record = TRUE;      // 啟用 Query Builder

$db['default'] = [
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '123456',
    'database' => 'my_db',
    'dbdriver' => 'mysqli',      // 推薦 mysqli 或 pdo
    'dbprefix' => 't_',          // 表前綴
    'pconnect' => FALSE,         // 非持久連線 (避免 sleep 進程堆積)
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'char_set' => 'utf8mb4',
    'dbcollat' => 'utf8mb4_unicode_ci',
    'swap_pre' => '',
    'autoinit' => TRUE,
    'stricton' => FALSE,         // TRUE 會執行 SET SESSION sql_mode=STRICT_ALL_TABLES
    'port'     => 3306,          // 明確指定埠號
];

關鍵參數深度解析

參數建議值說明
pconnectFALSE持久連線易導致「Too many connections」、睡眠進程堆積,高併發下極危險
db_debug開發 TRUE / 產 FALSE生產環境關閉,避免敏感 SQL 洩露
char_setutf8mb4支援 Emoji、完整 Unicode
strictonFALSE (慎用)TRUE 會拋出資料截斷、零日期等錯誤,需程式碼完美配合
autoinitTRUE載入即連線;FALSE 可延遲至首次查詢

多資料庫連線策略

1. 多群組配置

$db['reports'] = [
    'hostname' => '10.0.0.5',
    'username' => 'reporter',
    'password' => 'xxx',
    'database' => 'reports_db',
    'dbdriver' => 'mysqli',
    // ... 其他同 default
];

2. 動態切換連線

// 控制器中
$this->load->database('reports'); // 切換預設連線
$reportsDb = $this->load->database('reports', TRUE); // 取得獨立實例 (第二參數 TRUE)
$defaultDb = $this->db; // 原本的 default 連線

3. Model 層自動綁定連線 (推薦)

class MY_Model extends CI_Model {
    protected $dbGroup = 'default';
    
    public function __construct($group = '') {
        parent::__construct();
        $this->dbGroup = $group ?: $this->dbGroup;
        
        $CI =& get_instance();
        $attr = 'db_' . $this->dbGroup;
        if (isset($CI->$attr)) {
            $this->db = $CI->$attr;
        } else {
            $this->db = $CI->$attr = $CI->load->database($this->dbGroup, TRUE);
        }
    }
}

// 使用
class ReportModel extends MY_Model {
    public function __construct() { parent::__construct('reports'); }
}

PDO 驅動配置 (支援多種資料庫)

$db['default'] = [
    'dbdriver' => 'pdo',
    'hostname' => 'mysql:host=localhost;dbname=my_db;charset=utf8mb4', // DSN 寫在 hostname
    'username' => 'root',
    'password' => '123456',
    'database' => '', // PDO 不用此欄
    // ...
];

常見問題排查

  • 中文亂碼:確認 char_set=utf8mb4、資料表/欄位編碼一致、連線執行 SET NAMES utf8mb4
  • 連線失敗:檢查防火牆、MySQL bind-address、帳號主機權限 (user@'%')
  • Query Builder 衝突:$this->db->protect_identifiers = FALSE 關閉識別符號引用
  • 長查詢超時:mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10) 或 PDO ATTR_TIMEOUT

生產環境檢查清單

  1. 關閉 db_debug、啟用 cache_on (搭配快取驅動)
  2. 設定 pconnect = FALSE、監控 SHOW PROCESSLIST
  3. 備份腳本驗證 mysqldump --single-transaction --routines --triggers
  4. 慢查詢日誌 long_query_time = 1、定期 pt-query-digest 分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved