Hyperf 3.1 中数据库配置应通过 env() 读取 .env 变量实现环境隔离,禁止硬编码;需显式类型转换、合理设默认值、避免 .env 值加引号,并重载配置缓存。

1. 在 .env 中定义数据库变量
确保 `.env` 文件包含以下内容(按需修改):
DB_DRIVER=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=hyperf_demo DB_USERNAME=root DB_PASSWORD=secret DB_CHARSET=utf8mb4 DB_COLLATION=utf8mb4_unicode_ci DB_PREFIX=
2. 在 databases.php 中使用 env() 读取
打开 config/autoload/databases.php,将 `mysql` 配置项中的值替换为 env('KEY', 'default'):
return [
'default' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => (int) env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'hyperf'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
'connect_timeout' => 10.0,
'wait_timeout' => 3.0,
'heartbeat' => -1,
'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60),
],
'options' => [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
],
],
];
3. 注意关键细节
-
类型转换要显式处理:如
port和max_idle_time是数值型,需用(int)或(float)转换,否则可能被当成字符串导致连接失败 -
敏感字段留空时设默认值:如
DB_PASSWORD默认为空字符串'',避免传null引发 PDO 异常 -
不要在 .env 中加引号:写成
DB_PASSWORD=123456,而非DB_PASSWORD="123456"(Hyperf 的 DotEnv 解析器不支持带引号的值) -
修改后需重载配置缓存:执行
php bin/hyperf.php gen:config-cache(开发环境可先清缓存再重启服务)
4. 多库场景扩展写法
若需配置多个数据库(如主从),可在同一文件中定义不同键名,并同样用 env():
'slave' => [
'driver' => env('DB_SLAVE_DRIVER', 'mysql'),
'host' => env('DB_SLAVE_HOST', '127.0.0.1'),
// ... 其他字段同理
],
并在代码中通过 Db::connection('slave') 显式调用。
立即学习“PHP免费学习笔记(深入)”;
不复杂但容易忽略。



















