Hyperf的.env文件必须与databases.php严格对齐键名、类型及env()调用规范:DB_DRIVER等键名须小写且全字面量,默认值不可省略或嵌套表达式,读写分离需DB_READ_HOST/DB_WRITE_HOST拆分配置,未重启服务则修改不生效。

Hyperf 安装后,.env 文件不是“配了就能用”,必须和 config/autoload/databases.php 等配置文件严格对齐键名、类型与调用方式,否则连接池静默失效、启动报错或读写分离不生效。
必须设置的 MySQL 相关环境变量
Hyperf 默认通过 env() 从 .env 加载数据库参数,但只认特定键名,且所有值必须是字面量(不能是表达式):
-
DB_DRIVER=mysql—— 必须小写,框架不识别MYSQL或大写MySQL -
DB_HOST=127.0.0.1—— 单节点也必须配合databases.php中的read/write数组使用,这里只是备用值 -
DB_PORT=3306—— 写整数,别加引号;写成"3306"会导致连接超时(被转为0.0) -
DB_DATABASE=hyperf、DB_USERNAME=root、DB_PASSWORD=—— 空密码要显式写=,不能留空行或注释掉 -
DB_MAX_IDLE_TIME=60—— 用于(float) env('DB_MAX_IDLE_TIME', 60),必须是数字,不能是60s或1m
读写分离场景下 .env 的特殊写法
Hyperf 4.2 默认启用读写分离,哪怕你只连一个库,databases.php 里也必须有 read 和 write 子数组。这时 .env 不能只靠 DB_HOST,得拆开配:
- 用
DB_READ_HOST=192.168.1.10和DB_WRITE_HOST=192.168.1.20分开定义(键名可自定义,但要在databases.php里对应引用) - 如果读写同库,仍建议设两个变量(如
DB_READ_HOST=127.0.0.1、DB_WRITE_HOST=127.0.0.1),避免后续扩容时漏改 -
DB_STICKY=true—— 高并发写后立刻读场景必须开启,否则刚插入的数据可能查不到(主从延迟)
.env 和 databases.php 的协作关系
框架加载顺序是:.env → config/autoload/databases.php → 运行时环境变量。关键点在于:
-
env('DB_DATABASE', 'hyperf')中的默认值'hyperf'是字面量,必须存在;写成env('DB_DATABASE') ?: 'hyperf'会直接启动失败 - 所有
env()调用必须带第二参数,哪怕只是空字符串env('DB_PREFIX', '') -
.env中未定义的变量,不会 fallback 到默认值,而是抛出InvalidArgumentException: Database driver [mysql] not supported. - 多库配置(如
test库)需额外定义DB2_HOST、DB2_DATABASE等,且databases.php中必须完整复制pool等结构,不能复用default的配置
最常被忽略的是:改完 .env 后必须重启服务(php bin/hyperf.php start),因为配置在启动时一次性加载,运行中修改不生效;另外,config/autoload/ 下的 PHP 文件若用了 env(),其默认值必须是字面量——这点比 Laravel 更严格,稍不注意就卡在连接池初始化阶段。


















