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 $_ENVconfiguration不同, $_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未定义。 从那以后我开始使用它。