最推荐且兼容性最好的方式是使用 getenv() 函数;它跨平台、跨运行模式稳定读取环境变量,不依赖 php.ini 配置,支持单个获取(如 getenv('DB_HOST'))、带默认值写法及批量获取(getenv() 返回关联数组),而 $_SERVER 和 $_ENV 存在配置与环境限制。

PHP中获取环境变量参数,最推荐且兼容性最好的方式是使用 getenv() 函数。它能跨平台、跨运行模式(Web/CLI)稳定读取系统或服务器注入的环境变量,不依赖 php.ini 配置,也不受 variables_order 影响。
用 getenv() 安全读取单个变量
直接传入变量名即可,例如:
-
getenv('DB_HOST')→ 返回数据库主机地址字符串 -
getenv('APP_ENV') ?: 'production'→ 带默认值的写法,避免空值问题 - 注意:变量名区分大小写,
APP_ENV和app_env是两个不同变量
批量获取所有环境变量
调用不带参数的 getenv(),会返回一个关联数组,包含全部可用环境变量:
-
$all = getenv();→ 获取全部键值对 - 可用于调试,比如快速确认
REDIS_URL或JWT_SECRET是否已注入 - 生产环境慎用,避免意外泄露敏感信息
$_SERVER 和 $_ENV 的使用限制
这两个超全局变量也能访问部分环境变量,但有明确前提:
立即学习“PHP免费学习笔记(深入)”;
-
$_SERVER['APP_ENV']可用,因为 Web 服务器(如 Apache/Nginx)通常把环境变量映射进$_SERVER -
$_ENV['APP_ENV']仅在 php.ini 中variables_order = "EGPCS"(含 E)且未禁用时才有效;很多默认配置不含E,导致$_ENV为空 - 不建议依赖
$_ENV,尤其在容器或云平台部署中容易失效
CLI 与 Web 环境差异需留意
同一段代码,在命令行和浏览器中可能读到不同结果:
- CLI 下可直接用
export APP_DEBUG=1 && php script.php注入,getenv('APP_DEBUG')能立即读到 - Web 下必须由 Web 服务器或 PHP-FPM 主动传递:Apache 用
SetEnv,Nginx 用fastcgi_param,PHP-FPM 用env[APP_DEBUG] = 1 - 若 Web 请求中
getenv()返回 false,先检查 phpinfo() 页面的 “Environment” 区域是否列出该变量



















