Почему мой $ 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, они должны знать.