为什么我的 $_ENV 是空的?

2022-08-30 07:53:07

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

SetEnv FOO bar

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

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

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

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


答案 1

事实证明,这里有两个问题:

1. 只有在 php.ini 允许的情况下才会填充 $_ENV,默认情况下似乎没有这样做,至少在默认的 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 函数将始终工作,不受 PHP 设置为 $_ENV 的影响 此外,它似乎对大小写不敏感,这可能很有用。

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

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

答案 2

$_ENV变量是从运行PHP的环境导入的,根据您的设置(操作系统,服务器,PHP是作为Apache模块运行还是在FastCGI下运行等),这可能会有很大差异。

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


推荐