hyperf 默认不自动加载 .env 文件,需在 bin/hyperf.php 顶部手动调用 dotenv::createimmutable()->load();config/autoload/ 中直接使用 getenv() 或 env() 会因加载时机过早而返回空或默认值。

Hyperf 默认不自动加载 .env 文件,直接写 $_ENV 或用 getenv() 读不到你期望的值——这是多数人踩坑的第一步。
Hyperf 不自动读 .env,必须手动触发加载
Hyperf 的 dotenv 组件不会在框架启动早期自动执行,Environment 实例初始化时也尚未解析 .env。如果你在 config/autoload/constants.php 或 config/autoload/common.php 里直接调用 getenv('APP_ENV'),大概率拿到空字符串或默认值。
- 正确做法是在
bin/hyperf.php最顶部(早于Hyperf\Contract\ApplicationInterface初始化)插入:if (file_exists(__DIR__ . '/../.env')) { $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..'); $dotenv->load(); } - 确保已安装
vlucas/phpdotenv:运行composer require vlucas/phpdotenv - 不要在
config/autoload/下的 PHP 配置文件中依赖未加载的环境变量,它们的加载时机晚于.env解析
Environment::get() 与 getenv() 的行为差异
Environment::get() 是 Hyperf 封装的、基于 $_SERVER 和 $_ENV 的读取逻辑,但它**不主动从 .env 补充缺失项**;而 getenv('APP_ENV') 在 .env 加载后才有效。
ArcGIS for Android SDK 目前最新版本为10.2.5 从此版本开始ESRI不在提供Eclipse的插件支持,官方的帮助也针对于Android Studio的支持;本文档主要讲述的内容是最新版本ArcGIS For Android Eclipse环境配置;感兴趣的朋友可以过来看看
- 推荐统一使用
getenv('APP_ENV') ?? 'prod'判断环境,避免依赖Environment::get()的模糊 fallback -
Environment::get()默认会尝试读HYPERF_ENV→APP_ENV→$_SERVER['HTTP_HOST']→'production',但HTTP_HOST在 CLI 场景下为空,容易误判为production - CLI 命令(如
php bin/hyperf.php start)下,$_SERVER不含HTTP_HOST,此时若没设APP_ENV,Environment::get()会跳过并返回'production'
多环境配置文件如何按 APP_ENV 自动加载
Hyperf 支持通过 config/autoload/{env}/ 目录加载环境专属配置,但前提是框架能准确识别当前 APP_ENV —— 这又回到上一步的加载顺序问题。
- 确认
.env已加载后,在config/autoload/common.php中可安全使用:return [ 'app_env' => getenv('APP_ENV') ?: 'prod', ]; - 环境专属配置应放在
config/autoload/dev/、config/autoload/prod/等目录下,Hyperf 会自动合并(同名键覆盖) - 注意:仅
autoload/下的 PHP 文件参与自动合并,dev/目录里的database.php不会自动替代autoload/database.php,除非你在autoload/database.php中显式 include 它 - 更稳妥的做法是把差异化配置抽到
config/autoload/{env}.php(如dev.php),然后在主配置中条件加载:$env = getenv('APP_ENV') ?: 'prod'; if (file_exists(__DIR__ . "/{$env}.php")) { return include __DIR__ . "/{$env}.php"; }
常见错误现象与调试建议
运行 php bin/hyperf.php start 后发现日志输出仍是 production,数据库连的是线上地址,或者 redis.host 没生效——基本可以锁定是 .env 加载失败或环境判断错位。
- 加一行调试输出到
bin/hyperf.php顶部:echo "APP_ENV = " . (getenv('APP_ENV') ?: 'NOT SET') . PHP_EOL;启动时看是否打印出dev - 检查
.env文件权限和位置:必须在项目根目录(bin/hyperf.php的上两级),且不能是.env.example - 确认没有在
docker-compose.yml或supervisor中通过environment:覆盖了APP_ENV,Docker 环境变量优先级高于.env -
php -i | grep dotenv可确认扩展是否被其他组件干扰(极少,但存在)
真正麻烦的不是多环境本身,而是加载链路上任意一环断开:.env 位置不对、加载时机太晚、CLI 与 FPM 环境变量隔离、Docker 覆盖、甚至 IDE 的 Run Configuration 里硬编码了 APP_ENV —— 调试时得一层层剥开看实际生效的是哪个值。










