我正在运行Apache/2.2.11 (Win32) PHP/5.3.0
,我在.htaccess文件中执行了以下操作:
SetEnv FOO bar
如果我在PHP文件中打印出$_ENV
变量,我会得到一个空数组。为什么我的环境变量不会出现在那里?为什么它首先是空的?
我确实找到了我的变量,但它出现在$_SERVER
变量中。由于某种原因,它出现了两次,有点像。这是为什么?
[REDIRECT_FOO] => bar
[FOO] => bar
看来我可以使用getenv('FOO')
来获取它,所以也许我应该使用它。但我仍然对导致这种情况的原因感到好奇。这是一个Windows问题吗?或者是怎么回事?
答案 0 :(得分:93)
原来这里有两个问题:
<强> 1。仅在php.ini允许的情况下填充$_ENV
,默认情况下它似乎没有,至少在默认的WAMP server安装中没有。
; This directive determines which super global arrays are registered when PHP
; starts up. If the register_globals directive is enabled, it also determines
; what order variables are populated into the global space. G,P,C,E & S are
; abbreviations for the following respective super globals: GET, POST, COOKIE,
; ENV and SERVER. There is a performance penalty paid for the registration of
; these arrays and because ENV is not as commonly used as the others, ENV is
; is not recommended on productions servers. You can still get access to
; the environment variables through getenv() should you need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"
当我将variables_order
设置回EGPCS
时,$_ENV
不再为空。
<强> 2。当您在SetEnv
中使用.htaccess
时,它最终会出现在$_SERVER
中,而不会出现在$_ENV
中,我会说这有点令人困惑#39} ; s名为SetEnv
...
# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/
# php
var_dump($_SERVER['ENV'], $_SERVER['BASE']);
// string 'dev' (length=3)
// string '/ssl/' (length=5)
第3。 getenv
功能有效,因为它显然会搜索 $_ENV
和$_SERVER
。此外,它似乎对案例不敏感,这可能是有用的。
var_dump(getenv('os'), getenv('env'));
// string 'Windows_NT' (length=10)
// string 'dev' (length=3)
答案 1 :(得分:12)
$_ENV
变量是从运行PHP的环境导入的,根据您的设置(操作系统,服务器,PHP是作为Apache模块运行还是在FastCGI下运行等),这可能会有所不同很大。
$_ENV
中更改变量的唯一方法是更改Windows的环境变量(请参阅this)。在Windows上处理PHP扩展时,这可能很重要,因为其中一些(例如:php_ldap
)只能通过$_ENV
上的环境变量进行配置。
答案 2 :(得分:1)
REDIRECT_*
个变量。在我的服务器上,它们也是如此。它可能与在FastCGI下运行有关。如果与suexec结合使用,那么最有可能清理完整的环境变量池。可能还需要其他配置才能让他们回归PassEnv
。至于为什么getenv()适合你,我不知道。但所有现象都特定于您的服务器和PHP配置。在服务器故障上询问,他们应该知道。