Hyperf 的 MySQL 静态配置需严格遵循键名、嵌套结构、类型及 env() 调用规范:必须用 read/write 包裹 host 数组,env() 必须带字面量默认值,pool 参数须显式完整声明,多库需独立配置,语法错误会导致静默失败。

Hyperf 的 MySQL 静态配置文件(config/autoload/databases.php)不是“写对就行”,而是必须严格匹配框架对键名、嵌套结构、类型和环境变量调用方式的硬性约定;错一个字段名或漏掉 read/write 数组包装,连接池直接不生效,且无明确报错。
database.php 中必须用 read 和 write 包裹 host 数组
Hyperf 4.2 默认启用读写分离,哪怕你只配一个库,也必须显式声明 read 和 write 子数组——不能直接写 'host' => '127.0.0.1'。
-
read和write的值必须是数组,即使单节点也要写成['host' => ['127.0.0.1']],写成字符串会触发TypeError: array_merge(): Argument #2 must be of type array - 如果读写同库,两个数组内容可以完全一致,但结构不能省
-
sticky => true在高并发写后立刻读场景下必须开启,否则刚插入的记录可能从读库查不到(因主从延迟)
env() 调用必须带默认值,且不能嵌套函数
所有 env() 必须提供第二参数(默认值),且该值只能是字面量(字符串/数字/布尔),不能是函数调用或表达式。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- ✅ 正确:
'database' => env('DB_DATABASE', 'hyperf') - ❌ 错误:
'database' => env('DB_DATABASE') ?: 'hyperf'(?:会导致启动时解析失败) - ❌ 错误:
'port' => env('DB_PORT', intval(3306))(intval()在配置加载阶段未执行,会被当字符串处理) - 环境变量未设置时,框架不会 fallback 到默认值,而是抛出
InvalidArgumentException: Database driver [mysql] not supported.类似错误
连接池参数必须显式声明,不能依赖框架默认
Hyperf 不会自动合并配置层级中的 pool 设置,pool 必须作为 default 下的直系子键存在,且所有字段需完整写出。
- 缺失
'min_connections'或'max_connections'会导致连接池初始化失败,日志里只显示Connection pool is empty,无上下文 -
'connect_timeout'和'wait_timeout'单位是秒(浮点数),写成整数如10会被接受,但写成字符串"10"会静默转为0.0,导致连接瞬间超时 -
'max_idle_time'建议设为 60(秒),太小(如 10)会导致频繁重建连接,太大(如 300)可能堆积失效连接
多库配置时,每个库必须独立定义完整结构
添加第二个数据库(如 test)时,不能复用 default 的 pool 或 prefix 配置,必须逐项复制并覆盖。
- 不能写:
'test' => array_merge($default, ['host' => env('DB_HOST2')])(PHP 配置文件中不支持变量引用) - 每个库的
driver、charset、collation都要重写,哪怕值相同 - 若
test库不需要读写分离,仍要写'read' => ['host' => [...]]和'write' => ['host' => [...]],只是两者内容一样 - 使用
Db::connection('test')时,框架不会校验该库是否存在,直到第一次 query 才报Connection [test] not found
最易被忽略的是:配置文件里任何 PHP 语法错误(比如多了一个逗号、少了一个引号),都会让整个 databases.php 返回空数组,而 Hyperf 既不报错也不警告,只是后续所有 DB 操作都 fallback 到 default 或直接失败。建议每次修改后用 php -l config/autoload/databases.php 手动检查语法。


















