为什么我的$ _ENV为空?


78

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

SetEnv FOO bar

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

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

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

看来我可以使用来获得它getenv('FOO'),所以也许我应该只使用它。但是我仍然对造成这种情况的原因有些好奇。这是Windows问题吗?还是发生了什么事?


2
这不是Windows问题,在Linux中是一样的(将PHP作为模块运行)。我不确定细节,但可能是Web服务器的环境与PHP的环境不同,这就是为什么将它作为$_SERVERvar发送的原因。我会投票支持使用getenv()它,就我所收集的而言,它们仅搜索不区分大小写的内容。
Wrikken 2010年

1
附带说明一下:CLI实例确实获取它$_ENV
Wrikken 2010年

@svish您的更新对我有所帮助。如果您将其更改为答案,我会很乐意赞成。
Dominic Sayers

@svish您在问题中发布的解决方案应确实作为下面的答案发布。这个问题已被链接多次作为重复的接近目标,但该解决方案在问题中
显得

@MichaelBerkowski感谢您的来信。好主意。现在就做:)
Svish 2014年

Answers:


116

原来这里有两个问题:

1.$_ENV仅在php.ini允许的情况下进行填充,默认情况下似乎没有这样做,至少在默认的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_orderback设置为时EGPCS$_ENV不再为空。

2.当您SetEnv在中使用时.htaccess,它以而$_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函数将始终运行,并且不受$ _ENV的PHP设置的影响。此外,它似乎对大小写不敏感,这可能很有用。

var_dump(getenv('os'), getenv('env'));

// string 'Windows_NT' (length=10)
// string 'dev' (length=3)

6
啊!非常感谢!!!您不知道我已经花了多长时间思考一下mod_env或某些问题。我完全忘记了variables_order!谢谢你很棒!!!
Marcel 2015年

1
似乎该值现在应设置为不带引号。(错误PHP: syntax error, unexpected '"' in php.ini
yanot

1
谢谢!说,您能否将其分为三个答案,以便我可以投票三遍?:D
道格·麦克林

12

$_ENV 变量是从运行PHP的环境中导入的,并且取决于您的设置(操作系统,服务器,PHP是作为Apache模块运行还是在FastCGI下运行,等等),这可能会有很大不同。

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


1

REDIRECT_*如果使用的是RewriteRules,则会显示变量。在我的服务器上,它们也是如此。它可能与在FastCGI下运行有关。如果与suexec结合使用,最有可能清理整个环境的var池。PassEnv特别是可能需要进行其他配置才能恢复它们。至于为什么getenv()为您工作,我不知道。但是所有现象都是特定于您的服务器和php配置的。询问服务器故障,他们应该知道。


啊哈 我猜想重写模块可能与它有关。只是无法完全想象为什么要这样做。但我确定Apache有其原因:p(或错误)
Svish 2010年

2
如果您因getenv工作原因而睡不着:刚发现它显然可以搜索$_ENV $_SERVER:p
Svish 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.