<p>能用,但必须使用 DB_ 前缀环境变量(如 DBHOST),而非 MYSQL;Hyperf 仅解析 database.php 中显式引用的 DB_* 变量,且需确保连接池启用、配置加载、服务重启。</p>

Hyperf 里用环境变量配 MySQL 连接,MYSQL_HOST 等变量真能用吗?
不能直接用。Hyperf 的 database.php 配置默认读的是 DB_HOST、DB_PORT 这类前缀为 DB_ 的环境变量,不是 MySQL 官方客户端那套 MYSQL_*。哪怕你在 shell 里 export 了 MYSQL_HOST,Hyperf 启动时也完全不认——它压根不解析这些变量。
DB_* 环境变量怎么写才生效?
必须严格匹配 Hyperf 的配置键名,且只作用于 config/autoload/database.php 中定义的连接池。常见写法:
-
DB_HOST=localhost→ 对应'host' => env('DB_HOST', 'localhost') -
DB_PORT=3307→ 注意不是MYSQL_PORT,且值要能被 PHP 解析为整数(不能带引号) -
DB_DATABASE=shop→ 不会自动执行USE shop,只是设置默认库名 -
DB_USERNAME=admin和DB_PASSWORD=123!@#→ 密码含&、^等字符时,.env文件里要用单引号包裹,否则 dotenv 解析失败
Windows 下用 CMD 设置需加双引号:set "DB_PASSWORD=123!@#";PowerShell 则用 $env:DB_PASSWORD="123!@#"。
多个连接池怎么用环境变量区分?
Hyperf 不支持一个连接池靠环境变量动态切换 host 或 database,每个连接池必须显式定义。但你可以用不同前缀模拟“多套配置”:
- 在
.env里写:DB_WRITE_HOST=192.168.1.10、DB_READ_HOST=192.168.1.11 - 然后在
database.php中分别引用:'host' => env('DB_WRITE_HOST', 'localhost')和'host' => env('DB_READ_HOST', 'localhost') - 连接池名必须全小写、无点号,比如
'write_pool'和'read_pool',否则Db::connection('read_pool')会报Connection [read_pool] not found
别指望 DB_DATABASE 能让所有连接池共用一个库名——每个连接池的 database 字段都得单独配置,环境变量只是给它填值的来源。
为什么设了环境变量,Db::connection('xxx') 还连不上?
最常踩的坑是连接池没启用协程驱动,或配置未加载:
- 确认
hyperf/database组件已安装,且DatabaseAspect在config/autoload/aspects.php中启用 -
pool.enable_pool必须为true(默认是 true,但自定义配置里删了就失效) - 改完
.env或database.php后,必须重启服务,php bin/hyperf.php start不会热重载数据库配置 - 运行
php bin/hyperf.php hyperf:pool-status查看实际加载的连接池名和状态,used长期为 0 说明根本没被调用过
环境变量只是配置注入的入口,最终是否生效,取决于你有没有在对应连接池的配置项里真正引用它,以及框架是否成功加载该配置块。



















