Hyperf 3.0 实现多数据库连接需在 config/autoload/databases.php 的 connections 数组中显式声明多个唯一键名的完整连接配置,如 'slave1'、'pgsql_log',键名须小写+数字+下划线,driver 值必须正确且区分实例;使用时通过 Db::connection('key') 或模型 $connection 属性显式指定,参数严格大小写敏感。

Hyperf 3.0 中实现多数据库连接,核心是在 config/autoload/databases.php 文件中显式声明多个命名连接配置,每个连接需独立、完整、可区分。不能只改一个 default,必须新增带唯一键名的连接项。
H3 多库配置必须写在 databases.php 的 connections 数组里
该文件默认返回一个包含 'default' 连接的数组。要支持多库,直接在 'connections' 下追加新键值对,例如:
return [
'default' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'hyperf'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'fetch_mode' => PDO::FETCH_ASSOC,
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
'connect_timeout' => 10.0,
'wait_timeout' => 3.0,
'max_idle_time' => 60.0,
],
],
'slave1' => [ // ← 新增从库连接,键名小写、无特殊字符
'driver' => env('SLAVE1_DRIVER', 'mysql'),
'host' => env('SLAVE1_HOST', '192.168.1.100'),
'port' => env('SLAVE1_PORT', 3306),
'database' => env('SLAVE1_DATABASE', 'hyperf_slave'),
'username' => env('SLAVE1_USERNAME', 'reader'),
'password' => env('SLAVE1_PASSWORD', 'r3ad0nly'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'fetch_mode' => PDO::FETCH_ASSOC,
'pool' => [
'min_connections' => 1,
'max_connections' => 5,
'connect_timeout' => 10.0,
'wait_timeout' => 3.0,
'max_idle_time' => 60.0,
],
],
'pgsql_log' => [ // ← 可混用不同驱动,如 PostgreSQL
'driver' => 'pgsql',
'host' => env('LOG_PG_HOST', '127.0.0.1'),
'port' => env('LOG_PG_PORT', 5432),
'database' => env('LOG_PG_DATABASE', 'logdb'),
'username' => env('LOG_PG_USERNAME', 'loguser'),
'password' => env('LOG_PG_PASSWORD', ''),
'charset' => 'utf8',
'pool' => [
'min_connections' => 1,
'max_connections' => 3,
],
],
];H3 键名和驱动必须合法且不冲突
- 键名(如
'slave1'、'pgsql_log')必须是小写字母+数字+下划线,不能含点号、大写或空格; - 每个连接的
'driver'值必须明确,支持'mysql'、'pgsql'、'sqlite'、'sqlsrv'等,拼错会导致运行时报Driver not supported; - 不同连接可共用同一数据库类型,但必须指向不同实例(IP/端口/DB名),否则失去多库意义。
H3 使用时通过连接名显式指定
配置完后,代码中不自动切换,默认仍走 'default'。需主动调用:
- 查询:
Db::connection('slave1')->table('user_log')->select(); - 模型绑定:在模型类中加
protected $connection = 'slave1'; - 事务:
Db::connection('pgsql_log')->beginTransaction();
注意:Db::connection() 的参数必须与 databases.php 中定义的键名完全一致,大小写敏感,少一个字符就抛 Connection not found 异常。
H3 别忘了环境变量和连接池隔离
立即学习“PHP免费学习笔记(深入)”;
- 推荐所有参数通过
env()加载,便于不同环境切换; - 多库建议配置独立连接池参数(如
max_connections),避免主库高并发挤占从库资源; - 若使用 Redis 或其他组件做读写分离中间件,仍需在业务逻辑层控制路由,Hyperf 不自动分发 SQL。
不复杂但容易忽略



















