与 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"
(PHP 4, PHP 5, PHP 7, PHP 8)
getenv — 获取单个或所有环境变量的值
版本 | 描述 |
---|---|
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
参数返回本地设置的环境变量的值。
与 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"
如 httpoxy.org 上所述,getenv() 可能会让您误以为所有变量都来自“安全”环境(并非所有变量都来自安全环境)。
特别是,$_SERVER['HTTP_PROXY'](或其等效的 getenv('HTTP_PROXY'))可以在 HTTP 请求标头中手动设置,因此在 CGI 环境中不应将其视为安全。
简而言之,请尝试避免在没有正确过滤的情况下使用 getenv('HTTP_PROXY')。
此函数很有用(与 $_SERVER、$_ENV 相比),因为它以不区分大小写的方式在这些数组中搜索 $varname 键。
例如,在 Windows 上,$_SERVER['Path'] 就像您看到的大写,而不是您期望的 'PATH'。
所以只需: <?php getenv('path') ?>
我做了一个关于 env 的基准测试。
常量
0.00067687034606934 毫秒
getenv
0.056761026382446 毫秒
(越小越好)
https://github.com/eftec/php-benchmarks#define--const--env
而且,至少在 Windows 上,读取 env 值相当慢(与常量相比),因此 PHP 不会缓存信息,并且每次调用都会向操作系统请求 env 值。
因此,如果您每次请求只调用一次,那么就没有问题。但是,如果您每次请求都调用它很多次,那么它可能会影响性能。
到目前为止,所有注释和示例都严格针对 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)的环境变量设置方法来实现。
这使我们不必通过命令行参数管理数量庞大的每次执行的配置更改;相反,我们只需先设置相应的环境变量。
如您所知,getenv('DOCUMENT_ROOT') 非常有用。
但是,在 CLI 环境下(我倾向于快速检查
它是否有效),它在未修改 php.ini 的情况下不起作用
文件。所以我将 "export DOCUMENT_ROOT=~" 添加到我的 .bash_profile 中。
为了快速检查 getenv() 添加新的环境变量 -
如果您添加新的环境变量,请确保不仅要重启 apache,还要重启 xampp。
否则,对于新添加的环境变量,getenv() 将返回 false。
值得注意的是,由于当给定的变量未设置时 getenv('MY_VARIABLE') 将返回 false,因此在使用 getenv() 时,无法直接区分未设置的变量和显式设置为值 bool(false) 的变量。
这使得拥有布尔环境变量在未设置时默认为 true 变得有些棘手,您可以通过使用诸如 0 之类的“假值”以及严格比较运算符或使用超级全局数组和 isset() 来解决此问题。
SERVER_NAME 是在 apache 配置文件中定义的名称。
HTTP_HOST 是客户端在使用较新版本的 http 协议时发送的主机标头。
从 PHP 7.1 => getenv() 不再需要其参数。如果省略参数,则当前环境变量将作为关联数组返回。
来源:https://php.net/manual/en/migration71.changed-functions.php
在编写 CLI 应用程序时,请注意,在 Web 服务器配置中设置的任何环境变量都不会被传递。PHP 将传递以 php.ini 中的 safe_mode_allowed_env_vars 指令为前缀的系统环境变量。