ThinkPHP 3.2.3 資料庫層全面採用 PDO 重寫,配置系統大幅重構,移除舊有快取機制,新增調試模式、Lite 模式、分佈式部署等企業級特性。本文系統整理所有配置參數與最佳實踐。
| 參數 | 說明 | 預設值 | 備註 |
|---|---|---|---|
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 | 資料表前綴 | 空 | 如 think_ |
DB_CHARSET | 字元集 | utf8 | 建議 utf8mb4 支援 Emoji |
DB_PARAMS | PDO 連線參數陣列 | [] | 傳遞給 PDO 建構子第 4 參數 |
DB_DEBUG | 資料庫調試模式 | true | 獨立於 APP_DEBUG,開啟記錄 SQL 日誌 |
DB_LITE | 輕量模式 | false | 開啟後僅支援原生 SQL 查詢,效能較高 |
DB_FIELDS_CACHE | 欄位資訊快取 | true | 減少 DESC TABLE 查詢 |
DB_DEPLOY_TYPE | 部署類型 | 0 | 0=集中式(單機), 1=分佈式(主從) |
DB_RW_SEPARATE | 讀寫分離 | false | 需 DB_DEPLOY_TYPE=1 才生效 |
DB_MASTER_NUM | 主庫數量 | 1 | 讀寫分離時的主庫數 |
DB_SLAVE_NO | 指定從庫序號 | 空 | 空則隨機/輪詢 |
DB_FIELDTYPE_CHECK → 強制開啟欄位類型檢查DB_SQL_BUILD_CACHE、DB_SQL_BUILD_QUEUE、DB_SQL_BUILD_LENGTH → SQL 建構快取機制移除DB_SQL_LOG → 由 DB_DEBUG 取代DB_BIND_PARAM → PDO 自動參數綁定,無需配置<?php
// Application/Common/Conf/config.php
return [
// 資料庫配置
'DB_TYPE' => 'mysql',
'DB_HOST' => '192.168.1.100',
'DB_NAME' => 'thinkphp',
'DB_USER' => 'root',
'DB_PWD' => 'secure_password',
'DB_PORT' => '3306',
'DB_PREFIX' => 'tp_',
'DB_CHARSET' => 'utf8mb4',
'DB_DEBUG' => true, // 開發環境開啟
'DB_FIELDS_CACHE' => true,
'DB_LITE' => false, // 關閉以使用查詢構建器
// PDO 額外參數(可選)
'DB_PARAMS' => [
PDO::ATTR_PERSISTENT => false, // 非持久連線(PHP-FPM 建議關閉)
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",
],
];
?>
<?php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $connection = [
'db_type' => 'mysql',
'db_host' => '192.168.1.200', // 不同伺服器
'db_user' => 'readonly_user',
'db_pwd' => 'readonly_pass',
'db_name' => 'thinkphp_replica',
'db_port' => '3306',
'db_charset' => 'utf8mb4',
];
}
?>
<?php
class OrderModel extends Model {
// 格式:類型://用戶:密碼@主機:埠/資料庫#字元集
protected $connection = 'mysql://readonly_user:readonly_pass@192.168.1.200:3306/thinkphp_replica#utf8mb4';
}
?>
<?php
// 配置檔中定義命名連線
'DB_CONFIG_READONLY' => [
'db_type' => 'mysql',
'db_host' => '192.168.1.200',
'db_user' => 'readonly_user',
'db_pwd' => 'readonly_pass',
'db_name' => 'thinkphp_replica',
'db_port' => '3306',
'db_charset' => 'utf8mb4',
],
'DB_CONFIG_REPORT' => 'mysql://report_user:pass@192.168.1.201:3306/report_db#utf8mb4';
// 模型中引用
class ReportModel extends Model {
protected $connection = 'DB_CONFIG_REPORT'; // 字串引用配置項
}
?>
<?php
// M 方法第三個參數指定連線
$User = M('User', 'other_', 'mysql://user:pass@host:3306/db#utf8');
// 或引用配置名
$User = M('User', 'other_', 'DB_CONFIG_READONLY');
// 實例化後切換(進階)
$Model = new Home\Model\UserModel();
$Model->setConnection('DB_CONFIG_READONLY'); // Think\Model 方法
?>
<?php
return [
'DB_DEPLOY_TYPE' => 1, // 1 = 分佈式
'DB_RW_SEPARATE' => true, // 啟用讀寫分離
'DB_MASTER_NUM' => 1, // 1 個主庫
'DB_SLAVE_NO' => '', // 空 = 自動負載均衡
// 主庫配置
'DB_HOST' => '192.168.1.10', // 主庫寫入
'DB_USER' => 'master_user',
'DB_PWD' => 'master_pass',
// 從庫配置(陣列,支援多台)
'DB_SLAVE' => [
['host' => '192.168.1.11', 'user' => 'slave_user', 'pwd' => 'slave_pass'],
['host' => '192.168.1.12', 'user' => 'slave_user', 'pwd' => 'slave_pass'],
],
// 共用配置
'DB_NAME' => 'thinkphp',
'DB_PORT' => '3306',
'DB_PREFIX' => 'tp_',
'DB_CHARSET' => 'utf8mb4',
];
?>
<?php
// 開發環境:同時開啟
define('APP_DEBUG', true); // 應用調試
// config: 'DB_DEBUG' => true, // SQL 日誌
// 生產環境:關閉應用調試,但可單獨開啟 SQL 監控
define('APP_DEBUG', false);
// config: 'DB_DEBUG' => true, // 僅記錄慢查詢/錯誤 SQL
// 獲取執行的 SQL(需 DB_DEBUG=true)
$Model = M('User');
$Model->where('id', 1)->find();
echo $Model->getLastSql(); // 輸出最後執行的 SQL
?>
| 項目 | 3.2.2 | 3.2.3 | 動作 |
|---|---|---|---|
| 驅動 | mysql/mysqli/pdo | 統一 PDO | 移除舊驅動配置 |
| 調試 | 綁定 APP_DEBUG | 獨立 DB_DEBUG | 分離配置 |
| SQL 快取 | 支援 | 移除 | 改用 Redis/資料層快取 |
| 參數綁定 | 手動配置 | PDO 自動 | 移除 DB_BIND_PARAM |
| 字元集 | utf8 | 建議 utf8mb4 | 更新 DB_CHARSET |
ThinkPHP 3.2.3 的 PDO 重寫奠定了現代化資料庫存取基礎,配置系統更靈活、功能更完整,是 TP3 系列中最穩定、功能最豐富的版本。