getenv()与PHP中的$ _ENV

getenv()$_ENV什么区别?

任何使用之间的权衡?

我注意到有时getenv()给我我需要什么,而$_ENV不(如HOME )。

根据有关getenv的php文档 ,他们是完全一样的,除了getenv会以不区分大小写的方式查找variables。 大多数情况下,这可能没有关系,但对文档的评论之一解释:

例如在Windows $ _SERVER ['Path']就像你看到的那样,第一个字母大写,而不是像你所期望的那样是'PATH'。

因此,我可能会select使用getenv除非您确定要检索的variables标题的大小写。

另外$_ENV通常是空的,如果variables_order没有E列出。 在许多设置中,可能只有$_SERVER被填充,并且$_ENV严格用于CLI使用。

另一方面, getenv()直接访问环境。

(关于模糊性,可以更简单地使用array_change_key_case() 。)

我知道在文档中的评论说getenv是不区分大小写的,但这不是我所看到的行为:

 > env FOO=bar php -r 'print getenv("FOO") . "\n";' bar > env FOO=bar php -r 'print getenv("foo") . "\n";' > env foo=bar php -r 'print getenv("foo") . "\n";' bar > env foo=bar php -r 'print getenv("FOO") . "\n";' > php --version PHP 5.4.24 (cli) (built: Jan 24 2014 03:51:25) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies 

查看getenv函数的源代码 ,这是因为PHP可以通过三种方式获取环境variables:

  1. 通过sapi_getenv (例如,如果它从Apache获取环境variables)
  2. 如果在Windows上,从GetEnvironmentVariableA
  3. 如果在非Windows上,则由libc提供的getenv函数。

据我所知,只有在Windows上才会以不区分大小写的方式运行,因为这是Windows环境variablesAPI的行为。 如果你在Linux,BSD,Mac等,那么getenv仍然是大小写敏感的。

正如mario所提到的,由于variables_order $_ENVconfiguration不同, $_ENV并不总是被填充,因此如果不控制服务器configuration,最好避免使用$_ENV

所以,对于最便携的PHP代码:

  1. 使用getenv
  2. 为环境variables名称使用正确的大小写。

采取从PHP文件 :

这个函数很有用(与$_SERVER$_ENV相比),因为它以不区分大小写的方式search$ varname key。 例如在Windows $_SERVER['Path']就像你看到的大写,而不是像你所期望的' PATH '。 所以只是: <?php getenv('path') ?>

我发现getenv()有用,以避免奇怪的PHP错误 ,如果启用auto_globals_jit (首次使用时创build_SERVER_ENVvariables)有时$_SERVER$_ENV未定义。 从那以后我开始使用它。