Почему мой $ _ENV пуст? - PullRequest
       8

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

68 голосов
/ 23 сентября 2010

Я использую 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 ]

93 голосов
/ 22 ноября 2014

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

1. $_ENV заполняется, только если php.ini разрешает это , что, по-видимому, не выполняется по умолчанию, по крайней мере, при установке по умолчанию WAMP server .

; 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)
12 голосов
/ 23 сентября 2010

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

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

1 голос
/ 23 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...