为啥我的 $_ENV 是空的?

Posted

技术标签:

【中文标题】为啥我的 $_ENV 是空的?【英文标题】:Why is my $_ENV empty?为什么我的 $_ENV 是空的? 【发布时间】:2011-04-16 09:40:24 【问题描述】:

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

SetEnv FOO bar

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

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

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

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

【问题讨论】:

不是 Windows 问题,在 Linux 中也是如此(将 PHP 作为模块运行)。我不确定细节,但可能是网络服务器的环境与 PHP 的环境不同,这就是它作为$_SERVER var 发送的原因。我会投票支持使用getenv(),据我所知,它只是搜索它们不区分大小写。 附带说明:CLI 实例确实$_ENV 中获取它。 @svish 你的更新帮助了我。如果您将其更改为答案,我会很高兴地支持它。 @svish 您在问题中发布的解决方案确实应该作为答案发布在下面。该问题已多次链接为重复的关闭目标,但该问题的解决方案不合适:) @MichaelBerkowski 感谢您的来信。好主意。现在就做:) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

啊哈。我猜想重写模块可能与它有关。只是无法完全想象为什么会这样。但我确信 Apache 有其原因:p(或错误) 如果您因getenv 工作的原因而失眠:刚刚发现它显然搜索了$_ENV $_SERVER:p【参考方案3】:

原来这里有两个问题:

1. $_ENV 仅在 php.ini 允许的情况下才会填充,默认情况下它似乎不会这样做,至少在默认的 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。当您在.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 函数将始终有效,并且不受 $_ENV 的 PHP 设置的影响此外,它似乎不区分大小写,这可能很有用。

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

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

【讨论】:

啊!太感谢了!!!你不知道我在谷歌上搜索了多久,认为 mod_env 或其他东西有问题。我完全忘记了variables_order!谢谢你太棒了!!! 现在似乎应该设置不带引号的值。 (错误PHP: syntax error, unexpected '"' in php.ini 谢谢!说,你能把它分成三个答案,这样我就可以投票三次吗? :D 始终使用$_SERVERgetenv() 不是线程安全的:***.com/questions/30476600/… @jlh 为什么这很重要?无论如何,getenv 的回报都不应该改变。

以上是关于为啥我的 $_ENV 是空的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的相机胶卷模式是空的?

为啥我的 PATCH 请求的响应是空的? (Javascript)

为啥我的 CSRF 令牌在使用 Form::open() 时是空的?

谁能告诉我为啥我的过滤数组是空的?

为啥我的 ComboBox 是空的,尽管变量已初始化?

为啥我的数据库对象的集合是空的?