为什么我的$ _ENV是空的?

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

 SetEnv FOO bar 

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

我确实find了我的variables,但它出现在$_SERVERvariables中。 由于某种原因,它出现了两次。 为什么是这样?

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

看来我可以使用getenv('FOO') ,所以也许我应该使用它。 但是我还是有点好奇这是什么原因导致的。 这是Windows的问题吗? 或者是怎么回事?

结果发现这里有两个问题:

1. $_ENV只有在php.ini允许的情况下才会被填充 ,至less在缺省的WAMP服务器安装中,默认情况下它并不是这样做的。

 ; 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.当你在你的.htaccess使用SetEnv时,它会以$_SERVER结尾,而不是在$_ENV ,我想说当它被命名为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函数工作,因为它显然search$_ENV$_SERVER 。 此外,它似乎对案件不敏感,这可能是有用的。

 var_dump(getenv('os'), getenv('env')); // string 'Windows_NT' (length=10) // string 'dev' (length=3) 

$_ENVvariables是从运行PHP的环境中导入的,根据您的设置(操作系统,您的服务器,PHP是否作为Apache模块运行或者在FastCGI下运行等),这可能会有很大的不同。

IIRC在Windows下的标准Apache + mod_php安装中,更改$_ENVvariables的唯一方法是更改​​Windows的环境variables(请参阅此 )。 在Windows上处理PHP扩展时,这可能很重要,因为它们中的一些(例如: php_ldap )只能通过$_ENV上的环境variables来configuration。

如果您使用RewriteRules,则会显示REDIRECT_*variables。 在我的服务器上,他们也是如此。 这可能与在FastCGI下运行有关。 如果与suexec结合使用,那么最有可能清理完整的环境variables池。 有可能需要额外的configuration,让他们回来,特别是PassEnv 。 至于为什么getenv()适合你,我不知道。 但是所有的现象都是针对你的服务器和phpconfiguration的。 询问serverfault,他们应该知道。