PHP CLI 下 $_ENV 默认为空,应使用 getenv() 安全读取环境变量;$_SERVER 仅部分可用且不可靠;避免依赖未初始化的 $_ENV。
PHP CLI 模式下,$_ENV 默认是空的,不是所有环境变量都自动加载。这不是 Bug,而是 PHP 的安全默认:CLI SAPI 不会自动填充 $_ENV,除非显式启用或通过其他方式获取。
getenv() 是最直接可靠的读取方式无论 variables_order 设置如何,getenv() 都能读取当前进程继承的操作系统环境变量。它不依赖 $_ENV 是否被填充,也不受 php.ini 中 variables_order 影响。
getenv('HOME') → 返回路径字符串getenv('MISSING_VAR') → 返回 fals
e(不是 null 或空字符串)$val = getenv('DB_HOST') ?: 'localhost';
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'] 也不会自动更新。
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 脚本在不同机器上表现不一致的最常见原因。
来电咨询