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:
- 通过
sapi_getenv
(例如,如果它从Apache获取环境variables) - 如果在Windows上,从
GetEnvironmentVariableA
。 - 如果在非Windows上,则由
libc
提供的getenv
函数。
据我所知,只有在Windows上才会以不区分大小写的方式运行,因为这是Windows环境variablesAPI的行为。 如果你在Linux,BSD,Mac等,那么getenv
仍然是大小写敏感的。
正如mario所提到的,由于variables_order
$_ENV
configuration不同, $_ENV
并不总是被填充,因此如果不控制服务器configuration,最好避免使用$_ENV
。
所以,对于最便携的PHP代码:
- 使用
getenv
。 - 为环境variables名称使用正确的大小写。
采取从PHP文件 :
这个函数很有用(与
$_SERVER
,$_ENV
相比),因为它以不区分大小写的方式search$ varname key。 例如在Windows$_SERVER['Path']
就像你看到的大写,而不是像你所期望的'PATH
'。 所以只是:<?php getenv('path') ?>
我发现getenv()
有用,以避免奇怪的PHP错误 ,如果启用auto_globals_jit
(首次使用时创build_SERVER和_ENVvariables)有时$_SERVER
和$_ENV
未定义。 从那以后我开始使用它。