PHP中的getenv()与$ _ENV

tau*_*tau 75 php environment-variables

getenv()和之间有什么区别$_ENV

使用它们之间的任何权衡?

我注意到有时getenv()会给我我需要的东西,而$_ENV不是(如HOME).

Bat*_*ins 55

根据关于getenv的php文档,它们是完全相同的,除了getenv它将以不区分大小写的方式查找变量.大多数时候它可能无关紧要,但文档中的一条评论解释说:

例如在Windows $ _SERVER ['Path']就像你看到的那样,第一个字母大写,而不是你想象中的'PATH'.

因此,我可能会选择使用,getenv除非您确定要检索的变量标题的大小写.

  • 不解释为什么$ _ENV("FOO")和getenv("FOO")会返回不同的结果. (10认同)
  • 添加 `getenv()` 的优点:访问前不需要检查 `isset`/`empty`。`getenv()` 不会发出通知。 (2认同)

Con*_*roe 42

我知道文档中的评论说这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
Run Code Online (Sandbox Code Playgroud)

纵观源代码getenv功能,这是因为有PHP可以获取环境变量三种方式:

  1. 通过sapi_getenv(例如,如果它从Apache获取环境变量)
  2. 如果在Windows上,来自GetEnvironmentVariableA.
  3. 如果在非Windows上,则由getenv提供的功能提供libc.

据我所知,唯一一次它会以不区分大小写的方式运行在Windows上,因为这就是Windows环境变量API的行为方式.如果您使用的是Linux,BSD,Mac等,那么getenv仍然区分大小写.

马里奥所述,$_ENV由于配置不同,并不总是填充,variables_order因此$_ENV如果您不控制服务器配置,最好避免使用.

因此,对于最便携的PHP代码:

  1. 使用getenv.
  2. 对环境变量名称使用正确的大小写.


mar*_*rio 34

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

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

(关于案例模糊,可以更简单地使用array_change_key_case().)


Leo*_*zyk 6

我发现getenv()有用的方法是避免一个奇怪的PHP错误,该错误有时在某些地方启用,$_SERVER并且$_ENV如果auto_globals_jit启用则未定义(首次使用时创建_SERVER_ENV变量)。从那时起,我开始使用它。


Joe*_*een 5

我想补充一点, getenv() 是一个更好的选择,因为作为一个函数,它可以重载以用于测试目的。而覆盖 $_SERVER 或 $_ENV 变量可能会干扰测试框架和其他库,并最终需要更多的工作才能安全地执行。


mic*_*doo 5

我认为现有的答案很好地概述了使用中的任何差异,但也可能值得记住的是,用于加载环境变量的流行 PHP 库的维护者建议避免使用getenv

https://github.com/vlucas/phpdotenv

强烈建议不要使用 getenv() 和 putenv(),因为这些函数不是线程安全的