配置檔結構解析
$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, // 明確指定埠號
];
關鍵參數深度解析
| 參數 | 建議值 | 說明 |
| pconnect | FALSE | 持久連線易導致「Too many connections」、睡眠進程堆積,高併發下極危險 |
| db_debug | 開發 TRUE / 產 FALSE | 生產環境關閉,避免敏感 SQL 洩露 |
| char_set | utf8mb4 | 支援 Emoji、完整 Unicode |
| stricton | FALSE (慎用) | TRUE 會拋出資料截斷、零日期等錯誤,需程式碼完美配合 |
| autoinit | TRUE | 載入即連線;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
生產環境檢查清單
- 關閉
db_debug、啟用 cache_on (搭配快取驅動)
- 設定
pconnect = FALSE、監控 SHOW PROCESSLIST
- 備份腳本驗證
mysqldump --single-transaction --routines --triggers
- 慢查詢日誌
long_query_time = 1、定期 pt-query-digest 分析