与 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 现在可以为空。 |
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')。
我对 env 进行了基准测试。
常量
0.00067687034606934 ms
getenv
0.056761026382446 ms
(越小越好)
https://github.com/eftec/php-benchmarks#define--const--env
并且,至少在 Windows 上,读取 env 值速度相当慢(与常量相比),因此 PHP 不会缓存信息,而是在每次调用时向操作系统请求 env 值。
因此,如果每次请求只调用一次,那么就没有问题。但是,如果您每次请求调用多次,那么它可能会影响性能。
此函数很有用(与 $_SERVER、$_ENV 相比),因为它以大小写不敏感的方式在这些数组中搜索 $varname 键。
例如,在 Windows 上,$_SERVER['Path'] 的显示方式就像您看到的大写字母一样,而不是您期望的 'PATH'。
因此只需:<?php getenv('path') ?>
到目前为止,所有注释和示例都严格限于 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)环境变量设置方法来实现。
这使我们无需管理每次执行时通过命令行参数进行大量一次性配置更改;相反,我们只需先设置相应的 env 变量。
如您所知,getenv('DOCUMENT_ROOT') 非常有用。
但是,在 CLI 环境下(我倾向于快速检查
它是否有效),它在没有修改 php.ini
文件的情况下不起作用。因此,我在 .bash_profile 中添加了“export DOCUMENT_ROOT=~”。
值得注意的是,由于 getenv('MY_VARIABLE') 在给定的变量未设置时将返回 false,因此在使用 getenv() 时,无法直接区分未设置的变量和显式设置为值 bool(false) 的变量。
这使得布尔环境变量在未设置时默认为 true 有点棘手,你可以通过使用“假值”如 0 以及严格比较运算符,或者使用超全局数组和 isset() 来解决。
为了快速检查 getenv() 并添加一个新的环境变量 -
如果你添加一个新的环境变量,确保不仅重新启动 apache,还要重新启动 xampp。
否则 getenv() 将针对新添加的环境变量返回 false。
SERVER_NAME 是在 apache 配置中定义的名称。
HTTP_HOST 是客户端在使用较新版本的 http 协议时发送的 host 标头。
从 PHP 7.1 => getenv() 不再需要其参数。如果省略参数,则当前环境变量将作为关联数组返回。
来源: https://php.net/manual/en/migration71.changed-functions.php
在编写 CLI 应用程序时,请注意,web 服务器配置中设置的任何环境变量都不会被传递。PHP 将传递通过基于 php.ini 中 safe_mode_allowed_env_vars 指令添加前缀的系统环境变量。
关于如何回退的示例在 PHP 5.2 上会产生语法错误
-bash-3.2$ cat test.php
<?php
$ip = getenv('REMOTE_ADDR', true) ?: getenv('REMOTE_ADDR')
?>
-bash-3.2$ /web/cgi-bin/php5 test.php
Content-type: text/html
<br />
<b>Parse error</b>: syntax error, unexpected ':' in <b>/home/content/25/11223125/test.php</b> on line <b>3</b><br />
在 PHP 5.2 上,必须写
$ip = getenv('REMOTE_ADDR', true) ? getenv('REMOTE_ADDR', true) : getenv('REMOTE_ADDR')
返回访问浏览器远程地址的函数可能看起来像这样
<?php
function getIPfromXForwarded() {
$ipString=@getenv("HTTP_X_FORWARDED_FOR");
$addr = explode(",",$ipString);
return $addr[sizeof($addr)-1];
}
?>
请注意,某些地址后跟一个空格,ip2long(getIPfromXForwarded()) 不会返回预期的结果。
在你的脚本中使用 trim(),无论是在函数本身还是在调用者的周围空间。
问候