最常用且推荐的方式是通过config/database.php文件统一管理,所有连接定义在connections数组中,必须用小写字母+下划线命名,必填type、hostname、database、username、password、hostport等字段,charset建议utf8mb4,跨库用table()更安全;动态连接用Db::connect(),支持传键名或数组;.env优先覆盖配置,用于环境分离;SSL和连接池需额外配置params参数。

ThinkPHP配置数据库连接有多种方式,最常用且推荐的是通过 config/database.php 文件统一管理。只要配置项完整、键名规范、参数匹配实际环境,连接就能正常建立。其他方式适用于特殊场景,但不能替代基础配置的准确性。
标准配置:database.php 文件
这是项目上线和团队协作的首选方式,所有连接都定义在 config/database.php 的 connections 数组中:
- 每个连接必须用小写字母+下划线命名(如
'user_db'),不能含大写或点号 - 必填字段包括:
type(如'mysql')、hostname、database、username、password、hostport -
charset建议设为'utf8mb4',prefix可设为空字符串(''),跨库查询时用table('db_name.table')更清晰安全 - 若使用 SQL Server,
type必须是'sqlsrv',端口显式写1433,不要加dsn字段 - 达梦数据库需安装 TS 版 PHP 扩展,
type设为'dm',表名默认大写,且要补全框架缺失的 Builder 类
动态连接:Db::connect() 方法
适合临时切换库、对接外部系统或做数据迁移等一次性操作:
- 传字符串:如
Db::connect('log_db'),对应connections中已定义的键名 - 传数组:如
Db::connect(['type'=>'sqlite','database'=>'/tmp/test.db']),不依赖配置文件,但每次调用都新建连接实例 - 注意:必须链式调用,
Db::connect('log_db')->table('event')->select()是正确写法;拆成两行会回退到默认库
环境变量优先:.env 文件
开发与部署环境差异大时,用 .env 更灵活,它会自动覆盖 database.php 中同名配置:
立即学习“PHP免费学习笔记(深入)”;
- 在项目根目录添加
.env,写入类似内容:
DB_TYPE=mysql
DB_HOSTNAME=192.168.1.100
DB_DATABASE=app_prod
DB_USERNAME=prod_user
DB_PASSWORD=xxx
DB_HOSTPORT=3306
DB_CHARSET=utf8mb4 - 确保
.env未被.gitignore忽略,也未被部署脚本误删 - 验证是否生效:控制器中执行
Db::query('SELECT 1'),无异常即连接成功
SSL 加密与连接池优化
生产环境对安全和性能有要求时,需额外配置:
- MySQL 启用 SSL:SSL 参数只能放在
params数组里,用 PDO 常量作键,例如:'params' => [PDO::MYSQL_ATTR_SSL_CA => '/path/ca.pem'] - PDO 持久连接(轻量级池化):在对应连接的
params中加入PDO::ATTR_PERSISTENT => true,仅在 PHP-FPM 模式下有效 - 真正协程池需配合 Swoole:安装
topthink/think-swoole,在config/swoole.php中注册 MySQL 连接池服务,业务中改用Swoole\Coroutine\MySQL



















