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