getenv() 与 PHP 中的 $_ENV

2022-08-30 07:34:13

和 有什么区别?getenv()$_ENV

使用两者之间的任何权衡?

我注意到有时给了我我需要的东西,而没有(例如)。getenv()$_ENVHOME


答案 1

根据关于getenv的php文档,它们是完全相同的,除了在不区分大小写的文件系统(如Windows)上运行时,它将以不区分大小写的方式查找变量。在 Linux 主机上,它仍然区分大小写。大多数时候,这可能并不重要,但文档中的一条评论解释说:getenv

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

因此,我可能会选择使用来改善跨平台行为,除非您确定要检索的环境变量的大小写。getenv

史蒂夫·克莱(Steve Clay)在这个答案中的评论强调了另一个区别:

附加优势:您无需在访问之前检查/。 不会发出通知。getenv()issetemptygetenv()


答案 2

我知道文档中的评论说这是不区分大小写的,但这不是我看到的行为: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

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

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

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

正如马里奥所提到的,由于配置不同,并不总是填充的,所以如果你不控制服务器配置,最好避免。$_ENVvariables_order$_ENV

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

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

推荐