Почему мой $ ENV пуст?

Я Apache/2.2.11 (Win32) PHP/5.3.0 и я сделал следующее В моем .файл htaccess:

SetEnv FOO bar

если я распечатаю $_ENV переменная в PHP-файле, я получаю пустой массив. Почему моя переменная окружения не появляется там? Почему он вообще пустой?

Я нашел свою переменную, но она появляется в $_SERVER переменной. И почему-то он появляется дважды. Почему так?

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

кажется, я могу получить его с помощью getenv('FOO'), так что, может быть, я надо просто использовать это вместо этого. Но мне все еще немного любопытно, что вызывает это. Это проблема Windows? Или что происходит?

3 ответов


оказывается, здесь было два вопроса:

1. $_ENV заполняется только в случае php.ini позволяет это, что, похоже, не делается по умолчанию, по крайней мере, не в default 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. Когда вы используете 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. The getenv функция работала, потому что она, по-видимому, ищет и $_ENV и $_SERVER. Кроме того, он, похоже, делает это нечувствительным к делу, что может быть полезно.

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

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

$_ENV переменные импортируются из среды, в которой работает PHP, и в зависимости от вашей установки (ОС, ваш сервер, работает ли PHP как модуль Apache или под FastCGI и т. д.), это может сильно отличаться.

IIRC в стандартной установке Apache + mod_php на Windows, единственный способ изменить переменные в $_ENV - Это изменение переменных среды Windows (см. этой). Это может быть существенным при работе с расширениями PHP на Windows, потому что некоторые из них (например:php_ldap) настраиваются только через среду vars на $_ENV.


REDIRECT_* переменные появляются, если вы используете RewriteRules. На моем сервере они также появляются именно так. Это может иметь какое-то отношение к работе под FastCGI. И в сочетании с suexec это, скорее всего, очистит полный пул var среды. Там может быть дополнительная конфигурация, необходимая, чтобы получить их обратно,PassEnv особо. Почему функции getenv() работает для вас, я понятия не имею. Но все явления специфичны для вашего сервера и конфигурации php. Спросите на serverfault, они должны знать.