Hyperf不会自动将.env变量映射到数据库配置,必须在config/autoload/databases.php中显式调用env()函数(如'host' => env('DB_HOST', '127.0.0.1'))才能生效,否则仍使用硬编码值;同时需确保.env文件被正确加载且putenv()未被禁用。

因为 .env 文件只是环境变量的“源头”,不是配置的“最终生效处”。Hyperf(包括 3.1)在启动时会读取 .env 中的值(比如 DB_HOST、DB_NAME),但这些变量不会自动变成数据库连接参数——它们必须被显式读取、拼装,并写入到框架实际使用的配置文件中,比如 config/autoload/databases.php。
为什么 databases.php 必须手动改或正确引用 .env?
Hyperf 默认不自动把 DB_* 这类环境变量映射到数据库配置。它只提供一个空的配置骨架,你需要自己填进去:
- 原始
databases.php里可能是硬编码:'host' => '127.0.0.1',完全忽略 .env - 正确写法应是:
'host' => env('DB_HOST', '127.0.0.1'),这样才真正“连接”了 .env - 如果没写
env()调用,哪怕 .env 里写了DB_HOST=prod-db,数据库照样连本地
常见漏掉的关键点
不只是 host 和 name,这些字段都得对应引用:
-
port、database、username、password都要显式调用env() - 注意大小写和下划线:.env 写的是
DB_PASSWORD,代码里就得写env('DB_PASSWORD'),不能写成db_password - 某些项目还用了多库配置(如
mysql_write/mysql_read),每个连接都要单独配
验证是否真的生效
别只看 .env 是否修改成功,要确认运行时实际加载的值:
立即学习“PHP免费学习笔记(深入)”;
- 在命令行执行:
php bin/hyperf.php di:show --class Hyperf\Database\Connection,看输出里的 host 是不是你期望的值 - 或者临时加一行日志:
var_dump(env('DB_HOST'));放在databases.php开头,启动服务时看终端输出 - 如果输出是
false或空,说明putenv()被禁用,或 .env 没被加载(见下条)
额外干扰项:.env 本身可能根本没加载
即使 databases.php 写对了,.env 也可能没起作用:
- 检查
bin/hyperf.php开头是否调用了(new \Dotenv\Dotenv(BASE_PATH))->load();(Hyperf 3.1 默认有,但自定义入口可能删了) - Docker 环境下,
.env文件默认不会进容器,必须显式挂载:-v $(pwd)/.env:/path/to/project/.env - 有些精简版 PHP 镜像禁用了
putenv(),此时env()永远返回false,只能靠 Docker 的-e直接传参



















