hyperf本地开发和测试需为多数据库独立命名、完整配置、按需调用,避免混用default连接;通过.env管理环境差异,运行时显式指定连接,事务绑定单池,配置后须手动验证连通性。

Hyperf本地开发和测试环境要连多个数据库,关键不是堆配置,而是让每个连接语义清晰、切换可控、不互相干扰。默认连接别乱动,新库单独命名、完整定义、按需调用,避免“写错库”或“查错表”这种低级但高频的问题。
本地与测试库分开配置,别混用 default
default 连接只留给主业务库,本地开发用的测试库、日志库、mock 数据库都得独立起名,比如 test_user_db、local_log_db。这样能防止没显式指定连接时意外走 default,把测试数据写进开发库,或者反过来。
- 在
config/autoload/databases.php里为每个库单独写一个 connection 块,不要复用 default 的字段(比如 host、port、database 都得明确填) - 本地库建议加注释标明用途,例如:
// 仅用于 phpunit 测试,禁止上线使用 - 测试库的
pool.max_connections可设小些(如 5),避免占资源;本地调试库可关掉心跳:'heartbeat' => false,省去 PING 开销
环境变量驱动连接参数,避免硬编码
本地和测试环境差异主要在地址、库名、账号,这些全交给 .env 管理,配置文件只做结构定义。
- 例如定义本地用户库:
'test_user_db' => ['driver' => 'mysql', 'host' => env('TEST_USER_HOST', '127.0.0.1'), 'database' => env('TEST_USER_DB', 'test_users')] - 测试环境用 Docker Compose 时,host 直接填服务名(如
mysql-test),不用localhost—— 容器内 localhost 指自己,不是宿主机 - 密码这类敏感字段,本地开发可用明文(方便调试),测试 CI 环境务必从 secret 注入,且配置里不设默认值
运行时精准切换,别依赖全局上下文
Hyperf 不自动继承连接上下文,Db::table() 和模型 on() 是两套体系,各自指定才可靠。
- 原生查询必须先
Db::connection('test_user_db'),再链式调用->table()->where()->get(),顺序不能反 - Eloquent 模型想固定走测试库,直接在类里写:
protected $connection = 'test_user_db';临时切换用User::on('local_log_db')->get() - 事务只能绑定单个连接池,
Db::connection('test_user_db')->transaction(...)里不能再切到别的库,否则报错
验证连接是否生效,别等报错才发现
配完别急着写业务,先手动测通。尤其注意 MySQL 8.0+ 的认证插件和字符集兼容性。
- 启动后执行命令:
php bin/hyperf.php db:show-connections(如有该命令)或写个简单命令行任务,用Db::connection('xxx')->select('SELECT VERSION()')看能否返回版本号 - 本地连 MySQL 8.0 时,若报
caching_sha2_password错误,需在对应 connection 的options里加:PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_NONE和PDO::ATTR_EMULATE_PREPARES => false - 测试库如果只读,执行
insert或update会直接失败,这是正常行为,说明连接路由正确











