PHP如何让CLI读环境变量_CLI读环境变量方法【读取】

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

PHP CLI 读取环境变量的默认行为

PHP CLI 模式下,$_ENV 默认是空的,不是所有环境变量都自动加载。这不是 Bug,而是 PHP 的安全默认:CLI SAPI 不会自动填充 $_ENV,除非显式启用或通过其他方式获取。

getenv() 是最直接可靠的读取方式

无论 variables_order 设置如何,getenv() 都能读取当前进程继承的操作系统环境变量。它不依赖 $_ENV 是否被填充,也不受 php.inivariables_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'] 也不会自动更新。

  • 错误示范:
    echo $_ENV['APP_ENV'] ?? 'dev'; // 总是输出 'dev',即使 APP_ENV 已设
  • 正确做法:统一用 getenv('APP_ENV'),或封装一个安全读取函数
  • 调试建议:运行 print_r(array_keys($_SERVER));print_r(array_keys(getenv())); 对比实际可用键
环境变量读取本身不复杂,但混淆 $_ENV$_SERVERgetenv() 的行为边界,是 CLI 脚本在不同机器上表现不一致的最常见原因。