Подтвердить что ты не робот

Getenv() против $_ENV в PHP

В чем разница между getenv() и $_ENV?

Любые компромиссы между использованием:?

Я заметил, что иногда getenv() дает мне то, что мне нужно, а $_ENV не работает (например, HOME).

4b9b3361

Ответ 1

Согласно php-документации о getenv, они точно такие же, за исключением того, что getenv будет искать переменную без учета регистра. В большинстве случаев это, вероятно, не имеет значения, но в одном из комментариев к документации объясняется:

Например, в Windows $_SERVER [ "Путь" ], как вы видите, с заглавной буквой, а не "PATH", как вы могли ожидать.

Из-за этого я, вероятно, предпочел бы использовать getenv, если вы не уверены в оболочке заголовка переменной, которую вы пытаетесь получить.

Ответ 2

Я знаю, что комментарий в документах говорит, что getenv не чувствителен к регистру, но это не то поведение, которое я вижу:

> env FOO=bar php -r 'print getenv("FOO") . "\n";'
bar
> env FOO=bar php -r 'print getenv("foo") . "\n";'

> env foo=bar php -r 'print getenv("foo") . "\n";'
bar
> env foo=bar php -r 'print getenv("FOO") . "\n";'

> php --version
PHP 5.4.24 (cli) (built: Jan 24 2014 03:51:25)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

Рассматривая исходный код для функции getenv, это связано с тем, что PHP может получить переменную окружения:

  • Через sapi_getenv (например, если он получает переменную окружения из Apache)
  • Если в Windows, от GetEnvironmentVariableA.
  • Если на не-Windows, из функции getenv предоставляется libc.

Насколько я могу судить, единственное время, когда он будет вести себя нечувствительным к регистру, - это Windows, потому что это поведение API переменных среды Windows. Если вы работаете в Linux, BSD, Mac и т.д., То getenv все еще чувствителен к регистру.

Как упоминалось mario, $_ENV не всегда заполняется из-за разных конфигураций variables_order, поэтому лучше всего избегать $_ENV, если вы не контролируйте конфигурацию сервера.

Итак, для самого портативного PHP-кода:

  • Используйте getenv.
  • Используйте правильный аргумент для имени переменной среды.

Ответ 3

Дополнительно $_ENV обычно пуст, если variables_order не имеет E. На многих настройках вероятно, что заполняется только $_SERVER, а $_ENV - строго для использования CLI.

С другой стороны getenv() напрямую обращается к среде.

(Что касается случая-двусмысленности, можно было бы просто использовать array_change_key_case().)

Ответ 4

Я нашел getenv() полезным, чтобы избежать странной ошибки PHP, где иногда $_SERVER и $_ENV не были определены, если auto_globals_jit был включен (создание переменных _SERVER и _ENV при их первом использовании). С тех пор я начал им пользоваться.

Ответ 5

Взято из PHP docs:

Эта функция полезна (по сравнению с $_SERVER, $_ENV), потому что она ищет ключ $varname в этом режиме без учета регистра. Например, в Windows $_SERVER['Path'], как вы ожидали, вы видите "заглавные", а не "PATH". Так просто: <?php getenv('path') ?>

Ответ 6

Я бы добавил, что getenv() - лучший выбор, потому что, как функция, он может быть перегружен для целей тестирования. В то время как перезапись ваших переменных $ _SERVER или $ _ENV может помешать тестовым средам и другим библиотекам и в конечном итоге потребует намного больше работы для безопасного выполнения.