PHP Conference Japan 2024

getenv

(PHP 4, PHP 5, PHP 7, PHP 8)

getenv获取单个或所有环境变量的值

描述

getenv(?string $name = null, bool $local_only = false): string|array|false

获取单个或所有环境变量的值。

您可以使用 phpinfo() 查看所有环境变量的列表。许多这些变量都列在 » RFC 3875 中,特别是第 4.1 节,“请求元变量”。

参数

name

变量名,作为 stringnull

local_only

设置为 true 时,仅返回本地环境变量,由操作系统或 putenv 设置。仅当 namestring 时才有效。

返回值

返回环境变量 name 的值,如果环境变量 name 不存在,则返回 false。如果 namenull,则所有环境变量都作为关联 array 返回。

变更日志

版本 描述
8.0.0 name 现在可以为 null。
7.1.0 name 现在可以省略以检索所有环境变量的关联 array
7.0.9 添加了 local_only 参数。

示例

示例 #1 getenv() 示例

<?php
// getenv() 的示例用法
$ip = getenv('REMOTE_ADDR');

// 或者简单地使用超级全局变量 ($_SERVER 或 $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];

// 安全地获取环境变量的值,忽略它是否
// 由 SAPI 设置或已使用 putenv 更改
$ip = getenv('REMOTE_ADDR', true) ?: getenv('REMOTE_ADDR')
?>

注释

警告

如果 PHP 在 Fast CGI 等 SAPI 中运行,则此函数将始终返回由 SAPI 设置的环境变量的值,即使已使用 putenv() 设置了同名的本地环境变量。使用 local_only 参数返回本地设置的环境变量的值。

参见

添加注释

用户贡献的注释 12 条注释

匿名
6 年前
与 eng.mrkto.com 所述相反,getenv() 并不总是大小写不敏感的。在 Linux 上它不是。

<?php
var_dump
(getenv('path')); // bool(false)
var_dump(getenv('Path')); // bool(false)
var_dump(getenv('PATH')); // string(13) "/usr/bin:/bin"
yw()beeznest!com
8 年前
如 httpoxy.org 上所述,getenv() 可能会让您误以为所有变量都来自“安全”环境(并非所有变量都来自安全环境)。

特别是,$_SERVER['HTTP_PROXY'](或其等效的 getenv('HTTP_PROXY'))可以在 HTTP 请求标头中手动设置,因此在 CGI 环境中不应将其视为安全。

简而言之,请尝试避免在没有正确过滤的情况下使用 getenv('HTTP_PROXY')。
eng.mrkto.com
14 年前
此函数很有用(与 $_SERVER、$_ENV 相比),因为它以不区分大小写的方式在这些数组中搜索 $varname 键。
例如,在 Windows 上,$_SERVER['Path'] 就像您看到的大写,而不是您期望的 'PATH'。
所以只需: <?php getenv('path') ?>
jcastromail at yahoo dot es
4 年前
我做了一个关于 env 的基准测试。

常量
0.00067687034606934 毫秒
getenv
0.056761026382446 毫秒

(越小越好)

https://github.com/eftec/php-benchmarks#define--const--env

而且,至少在 Windows 上,读取 env 值相当慢(与常量相比),因此 PHP 不会缓存信息,并且每次调用都会向操作系统请求 env 值。

因此,如果您每次请求只调用一次,那么就没有问题。但是,如果您每次请求都调用它很多次,那么它可能会影响性能。
php at keith tyler dot com
12 年前
到目前为止,所有注释和示例都严格针对 CGI。
在 CLI 中,getenv()/putenv() 的实用性也不容小觑。

您可以通过环境变量将多个变量传递给 CLI 脚本,在 Unix/Linux bash/sh 中使用 "VAR='foo'; export $VAR" 模式,或在 Windows 中使用 "set VAR='foo'" 模式。(Csh 用户,请自行解决!)getenv("VAR") 将从环境中检索该值。

我们有一个系统,通过该系统包含一个充满 putenv() 语句的文件,这些语句存储可以应用于许多不同 CLI PHP 程序的配置值。但是,如果我们想覆盖这些值,我们可以使用 shell(或调用应用程序,例如 ant)的环境变量设置方法来实现。

这使我们不必通过命令行参数管理数量庞大的每次执行的配置更改;相反,我们只需先设置相应的环境变量。
kyong
20 年前
如您所知,getenv('DOCUMENT_ROOT') 非常有用。
但是,在 CLI 环境下(我倾向于快速检查
它是否有效),它在未修改 php.ini 的情况下不起作用
文件。所以我将 "export DOCUMENT_ROOT=~" 添加到我的 .bash_profile 中。
pritisn at gmail dot com
9 年前
为了快速检查 getenv() 添加新的环境变量 -
如果您添加新的环境变量,请确保不仅要重启 apache,还要重启 xampp。
否则,对于新添加的环境变量,getenv() 将返回 false。
Anonymous
5 年前
值得注意的是,由于当给定的变量未设置时 getenv('MY_VARIABLE') 将返回 false,因此在使用 getenv() 时,无法直接区分未设置的变量和显式设置为值 bool(false) 的变量。
这使得拥有布尔环境变量在未设置时默认为 true 变得有些棘手,您可以通过使用诸如 0 之类的“假值”以及严格比较运算符或使用超级全局数组和 isset() 来解决此问题。
sam at sambarrow dot com
16 年前
SERVER_NAME 是在 apache 配置文件中定义的名称。
HTTP_HOST 是客户端在使用较新版本的 http 协议时发送的主机标头。
hello at jabran dot me
9 年前
请注意,在将此函数与 PHP 内置服务器一起使用时 - 即 php -S localhost:8000 – 它将返回布尔值 FALSE。
larby dot robert at gmail dot com
6 年前
从 PHP 7.1 => getenv() 不再需要其参数。如果省略参数,则当前环境变量将作为关联数组返回。

来源:https://php.net/manual/en/migration71.changed-functions.php
chuck dot reeves at gmail dot com
14 年前
在编写 CLI 应用程序时,请注意,在 Web 服务器配置中设置的任何环境变量都不会被传递。PHP 将传递以 php.ini 中的 safe_mode_allowed_env_vars 指令为前缀的系统环境变量。
To Top