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