我正在运行,Apache/2.2.11 (Win32) PHP/5.3.0并且在.htaccess文件中执行了以下操作:
Apache/2.2.11 (Win32) PHP/5.3.0
SetEnv FOO bar
如果我$_ENV在PHP文件中打印出变量,则会得到一个空数组。为什么我的环境变量没有出现在这里?为什么首先是空的?
$_ENV
我确实找到了变量,但是它出现在$_SERVER变量中。由于某种原因,它出现了两次。为什么是这样?
$_SERVER
[REDIRECT_FOO] => bar [FOO] => bar
看来我可以使用来获得它getenv('FOO'),所以也许我应该只使用它。但是我仍然对造成这种情况的原因有些好奇。这是Windows问题吗?还是发生了什么事?
getenv('FOO')
原来这里有两个问题:
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不再是空的。
variables_order
EGPCS
2.当您SetEnv在中使用时.htaccess,它以而$_SERVER不是中结束$_ENV,我得说这在命名时有点令人困惑SetEnv…
SetEnv
.htaccess
# .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设置的影响。此外,它似乎对大小写不敏感,这可能很有用。
getenv
var_dump(getenv('os'), getenv('env')); // string 'Windows_NT' (length=10) // string 'dev' (length=3)