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

ThinkPHP 3.2.3 資料庫配置新特性完整解析:PDO 驅動、多連線與動態切換

     編輯:PHP 相關知識

ThinkPHP 3.2.3 資料庫配置新特性完整解析

ThinkPHP 3.2.3 將資料庫驅動全面重寫為 PDO 為基礎,帶來更靈活的配置方式、多資料庫連線支援、讀寫分離與動態切換能力。本文詳細解析新版配置參數、連線字串格式、模型級連線設定與實戰應用模式。

完整資料庫配置參數表

參數說明預設值備註
DB_TYPE資料庫類型mysqlmysql/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除錯模式falsetrue 記錄 SQL 日誌
DB_LITE輕量模式falsetrue 僅支援原生 SQL 查詢
DB_FIELDS_CACHE欄位快取true生產環境建議開啟
DB_DEPLOY_TYPE部署類型00=單機, 1=主從分散式
DB_RW_SEPARATE讀寫分離false主從模式下生效
DB_MASTER_NUM主庫數量1讀寫分離時
DB_SLAVE_NO指定從庫序號空空=隨機輪詢
DB_PARAMSPDO 連線參數[]傳遞給 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_CHECKPDO 強制型別檢查,無需設定
DB_SQL_BUILD_CACHE已移除 SQL 建構快取機制
DB_SQL_BUILD_QUEUE已移除
DB_SQL_BUILD_LENGTH已移除
DB_SQL_LOG改用 DB_DEBUG 參數控制
DB_BIND_PARAMPDO 自動參數綁定,無需設定

最佳實踐建議

  1. 環境區隔:使用 `.env` 或 `Conf/config_{env}.php` 區分開發/測試/生產配置
  2. 連線池:高併發場景建議使用 Swoole/Workerman 長連線或 ProxySQL 連線池
  3. 只讀帳號:從庫建立唯讀帳號,限制權限降低風險
  4. 監控告警:整合 `DB_DEBUG` 日誌至 ELK/日誌系統,監控慢查詢
  5. 備份策略:主從架構下,備份從庫避免影響主庫效能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved