为什么我的$ _ENV为空?

时间:2010-09-23 17:15:23

标签: php apache environment-variables

我正在运行Apache/2.2.11 (Win32) PHP/5.3.0,我在.htaccess文件中执行了以下操作:

SetEnv FOO bar

如果我在PHP文件中打印出$_ENV变量,我会得到一个空数组。为什么我的环境变量不会出现在那里?为什么它首先是空的?

我确实找到了我的变量,但它出现在$_SERVER变量中。由于某种原因,它出现了两次,有点像。这是为什么?

[REDIRECT_FOO] => bar
[FOO] => bar

看来我可以使用getenv('FOO')来获取它,所以也许我应该使用它。但我仍然对导致这种情况的原因感到好奇。这是一个Windows问题吗?或者是怎么回事?

3 个答案:

答案 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下运行等),这可能会有所不同很大。

在Windows上安装标准的Apache + mod_php中的IIRC,在$_ENV中更改变量的唯一方法是更改​​Windows的环境变量(请参阅this)。在Windows上处理PHP扩展时,这可能很重要,因为其中一些(例如:php_ldap)只能通过$_ENV上的环境变量进行配置。

答案 2 :(得分:1)

如果您使用RewriteRules,则会出现

REDIRECT_*个变量。在我的服务器上,它们也是如此。它可能与在FastCGI下运行有关。如果与suexec结合使用,那么最有可能清理完整的环境变量池。可能还需要其他配置才能让他们回归PassEnv。至于为什么getenv()适合你,我不知道。但所有现象都特定于您的服务器和PHP配置。在服务器故障上询问,他们应该知道。