Почему мой $_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
Оказывается, здесь было две проблемы:
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
всегда будет работать и не будет зависеть от настройки 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, единственный способ изменить переменные в $_ENV
- изменить переменные среды Windows (см. this). Это может быть важно при работе с расширениями PHP в Windows, потому что некоторые из них (например: php_ldap
) настраиваются только через vars среды на $_ENV
.
Ответ 3
REDIRECT_*
появляются переменные, если вы используете RewriteRules. На моем сервере они тоже появляются именно так. Это может иметь какое-то отношение к работе в FastCGI. И если в сочетании с suexec, это, скорее всего, очистит полную среду var pool. Возможно, потребуется дополнительная настройка, чтобы вернуть их, PassEnv
. Что касается того, почему getenv() работает для вас, я понятия не имею. Но все явления специфичны для вашей конфигурации сервера и php. Спросите на serverfault, они должны знать.