PHP CLI 下 $_ENV 默认为空,应使用 getenv() 安全读取环境变量;$_SERVER 仅部分可用且不可靠;避免依赖未初始化的 $_ENV。

PHP CLI 读取环境变量的默认行为
PHP CLI 模式下,$_ENV 默认是空的,不是所有环境变量都自动加载。这不是 Bug,而是 PHP 的安全默认:CLI SAPI 不会自动填充 $_ENV,除非显式启用或通过其他方式获取。
getenv() 是最直接可靠的读取方式
无论 variables_order 设置如何,getenv() 都能读取当前进程继承的操作系统环境变量。它不依赖 $_ENV 是否被填充,也不受 php.ini 中 variables_order 影响。
- 读取存在变量:
getenv('HOME')→ 返回路径字符串 - 读取不存在变量:
getenv('MISSING_VAR')→ 返回false(不是null或空字符串) - 安全写法:
$val = getenv('DB_HOST') ?: 'localhost'; - 区分大小写:Linux/macOS 下
getenv('PATH')有效,getenv('path')无效
$_SERVER 也能用,但有边界条件
$_SERVER 在 CLI 下会包含部分环境变量(尤其是由 shell 传入的),但它不是完整镜像,且行为因 PHP 版本和启动方式略有差异。
- 常见可用项:
$_SERVER['HOME']、$_SERVER['PWD']、$_SERVER['USER'] - 不可靠项:
$_SERVER['PATH']可能被 PHP 内部覆盖,$_SERVER['SHELL']在某些容器中为空 - 注意:
$_SERVER不包含通过putenv()后续设置的变量,而getenv()可以
避免踩坑:别依赖未初始化的 $_ENV
除非你在 php.ini 中设置了 variables_order = "EGPCS"(含 E),否则 CLI 下 $_ENV 始终为空数组。即使你执行了 putenv('FOO=bar'),$_ENV['FOO'] 也不会自动更新。
立即学习“PHP免费学习笔记(深入)”;
- 错误示范:
echo $_ENV['APP_ENV'] ?? 'dev'; // 总是输出 'dev',即使 APP_ENV 已设
- 正确做法:统一用
getenv('APP_ENV'),或封装一个安全读取函数 - 调试建议:运行
print_r(array_keys($_SERVER));和print_r(array_keys(getenv()));对比实际可用键
$_ENV、$_SERVER 和 getenv() 的行为边界,是 CLI 脚本在不同机器上表现不一致的最常见原因。











