web-dev-qa-db-ja.com

$ _ENVが空なのはなぜですか?

Apache/2.2.11 (Win32) PHP/5.3.0を実行しています。htaccessファイルで次のことを行いました。

_SetEnv FOO bar
_

_$_ENV_変数をPHPファイルで印刷すると、空の配列が得られます。

私は自分の変数を見つけましたが、_$_SERVER_変数に表示されます。そして、なんらかの理由で、2回表示されます。どうしてこれなの?

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

getenv('FOO')を使用して取得できるようですので、代わりにそれを使用する必要があります。しかし、私はまだこれが原因であることに少し興味があります。これはWindowsの問題ですか?または何が起こっていますか?

72
Svish

ここには2つの問題がありました。

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_orderEGPCSに戻すと、$_ENVは空ではなくなります。

2。 .htaccessSetEnvを使用すると、$_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)
95
Svish

$_ENV 変数は、PHPが実行されている環境から、そしてセットアップ(OS、サーバー、 PHPがApacheモジュールとして実行されるか、FastCGIなどで実行されるか)にかかわらず、これは大きく異なる可能性があります。

Windowsでの標準Apache + mod_phpインストールのIIRC、$_ENVの変数を変更する唯一の方法は、Windowsの環境変数を変更することです( this を参照)。これは、WindowsでPHP拡張機能を扱う場合に重要になることがあります。なぜなら、それらの一部(例: php_ldap )は$_ENVの環境変数。

12

REDIRECT_*変数は、RewriteRulesを使用している場合に表示されます。私のサーバーでは、それらも同様に表示されます。 FastCGIで実行することに関係があるかもしれません。また、suexecと組み合わせると、環境変数プール全体をクリーンアップする可能性が最も高くなります。特にPassEnvに戻すには、追加の構成が必要になる場合があります。 getenv()があなたのために働く理由について、私は見当もつかない。ただし、すべての現象はサーバーとphpの構成に固有のものです。 serverfaultで尋ねてください、彼らは知っているべきです。

1
mario