ThinkPHP 3.2.3 資料庫配置新特性完整解析
ThinkPHP 3.2.3 將資料庫驅動全面重寫為 PDO 為基礎,帶來更靈活的配置方式、多資料庫連線支援、讀寫分離與動態切換能力。本文詳細解析新版配置參數、連線字串格式、模型級連線設定與實戰應用模式。
完整資料庫配置參數表
| 參數 | 說明 | 預設值 | 備註 |
| DB_TYPE | 資料庫類型 | mysql | mysql/sqlite/oracle/pgsql/sqlsrv/firebird |
| DB_HOST | 伺服器地址 | 127.0.0.1 | 建議用 IP 避免 DNS 解析延遲 |
| DB_NAME | 資料庫名稱 | - | 必填 |
| DB_USER | 使用者名稱 | - | 必填 |
| DB_PWD | 密碼 | - | 必填 |
| DB_PORT | 連接埠 | 3306 | 空值使用預設埠 |
| DB_PREFIX | 資料表前綴 | 空 | 如 tp_ |
| DB_CHARSET | 字元集 | utf8 | 建議 utf8mb4 (支援 Emoji) |
| DB_DEBUG | 除錯模式 | false | true 記錄 SQL 日誌 |
| DB_LITE | 輕量模式 | false | true 僅支援原生 SQL 查詢 |
| DB_FIELDS_CACHE | 欄位快取 | true | 生產環境建議開啟 |
| DB_DEPLOY_TYPE | 部署類型 | 0 | 0=單機, 1=主從分散式 |
| DB_RW_SEPARATE | 讀寫分離 | false | 主從模式下生效 |
| DB_MASTER_NUM | 主庫數量 | 1 | 讀寫分離時 |
| DB_SLAVE_NO | 指定從庫序號 | 空 | 空=隨機輪詢 |
| DB_PARAMS | PDO 連線參數 | [] | 傳遞給 PDO 建構子第 4 參數 |
| DB_DSN | 自訂 DSN | 自動生成 | 特殊需求時手動指定 |
標準配置範例
<?php
// Application/Common/Conf/config.php
return [
'DB_TYPE' => 'mysql',
'DB_HOST' => '192.168.1.100',
'DB_NAME' => 'thinkphp',
'DB_USER' => 'app_user',
'DB_PWD' => 'secure_password',
'DB_PORT' => '3306',
'DB_PREFIX' => 'tp_',
'DB_CHARSET' => 'utf8mb4',
'DB_DEBUG' => true, // 開發環境開啟
'DB_FIELDS_CACHE' => true,
'DB_DEPLOY_TYPE' => 1, // 啟用主從
'DB_RW_SEPARATE' => true, // 讀寫分離
'DB_MASTER_NUM' => 1,
'DB_SLAVE_NO' => '', // 隨機選擇從庫
// 從庫配置 (DB_DEPLOY_TYPE=1 時使用)
'DB_SLAVE_CONFIG' => [
['DB_HOST' => '192.168.1.101', 'DB_USER' => 'slave_user', 'DB_PWD' => 'slave_pass'],
['DB_HOST' => '192.168.1.102', 'DB_USER' => 'slave_user', 'DB_PWD' => 'slave_pass'],
],
];
?>
模型級獨立資料庫連線設定
<?php
// Application/Home/Model/UserModel.class.php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
// 方式一:陣列配置 (參數名小寫)
protected $connection = [
'db_type' => 'mysql',
'db_host' => '192.168.1.200',
'db_name' => 'user_center',
'db_user' => 'uc_user',
'db_pwd' => 'uc_pass',
'db_port' => '3306',
'db_charset'=> 'utf8mb4',
];
// 方式二:連線字串 (DSN 格式)
// protected $connection = 'mysql://uc_user:uc_pass@192.168.1.200:3306/user_center#utf8mb4';
// 方式三:引用全域配置項
// protected $connection = 'DB_CONFIG_USER_CENTER';
}
?>
全域定義多組資料庫配置
<?php
// Application/Common/Conf/config.php
return [
// 主資料庫
'DB_CONFIG_MAIN' => [
'db_type' => 'mysql',
'db_host' => '192.168.1.100',
'db_name' => 'main_db',
'db_user' => 'main_user',
'db_pwd' => 'main_pass',
'db_port' => '3306',
'db_charset' => 'utf8mb4',
],
// 使用者中心資料庫
'DB_CONFIG_UC' => 'mysql://uc_user:uc_pass@192.168.1.200:3306/user_center#utf8mb4',
// 日誌資料庫 (SQLite)
'DB_CONFIG_LOG' => [
'db_type' => 'sqlite',
'db_name' => RUNTIME_PATH . 'logs/data.db',
],
];
?>
動態切換資料庫連線 (M 方法進階用法)
<?php
// 控制器中動態指定連線
// 1. 使用字串 DSN
$User = M('User', 'other_', 'mysql://user:pass@192.168.1.200:3306/other_db#utf8mb4');
$User->select();
// 2. 使用配置項名稱
$User = M('User', 'other_', 'DB_CONFIG_UC');
$User->select();
// 3. 使用陣列配置
$User = M('User', 'other_', [
'db_type' => 'mysql',
'db_host' => '192.168.1.200',
'db_name' => 'other_db',
'db_user' => 'user',
'db_pwd' => 'pass',
'db_port' => '3306',
'db_charset' => 'utf8mb4',
]);
// 4. 臨時切換現有模型實例連線
$User = M('User');
$User->db('DB_CONFIG_UC')->select(); // 只影響這次查詢
$User->select(); // 回復預設連線
?>
資料庫除錯與 SQL 日誌
<?php
// 開啟除錯模式後,可取得最後執行的 SQL
$User = M('User');
$list = $User->where(['status' => 1])->select();
// 取得最後一條 SQL (不含參數綁定)
$lastSql = $User->getLastSql();
echo "執行 SQL: {$lastSql}
";
// 完整 SQL 日誌 (需 DB_DEBUG=true)
$sqlLog = $User->getDbFields(); // 實際上需查看 Think\Log::getLog()
// 或在頁面 Trace 中查看 (SHOW_PAGE_TRACE=true)
?>
遷移自 3.2.2 的棄用參數
| 已移除參數 | 替代方案 |
| DB_FIELDTYPE_CHECK | PDO 強制型別檢查,無需設定 |
| DB_SQL_BUILD_CACHE | 已移除 SQL 建構快取機制 |
| DB_SQL_BUILD_QUEUE | 已移除 |
| DB_SQL_BUILD_LENGTH | 已移除 |
| DB_SQL_LOG | 改用 DB_DEBUG 參數控制 |
| DB_BIND_PARAM | PDO 自動參數綁定,無需設定 |
最佳實踐建議
- 環境區隔:使用 `.env` 或 `Conf/config_{env}.php` 區分開發/測試/生產配置
- 連線池:高併發場景建議使用 Swoole/Workerman 長連線或 ProxySQL 連線池
- 只讀帳號:從庫建立唯讀帳號,限制權限降低風險
- 監控告警:整合 `DB_DEBUG` 日誌至 ELK/日誌系統,監控慢查詢
- 備份策略:主從架構下,備份從庫避免影響主庫效能