Почему мой $ _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? Или что происходит?

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

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_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. Функция 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. Спросите на сервере, они должны знать.