getenv () против $ _ENV в PHP - PullRequest
       9

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

69 голосов
/ 10 января 2012

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

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

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

Ответы [ 6 ]

52 голосов
/ 10 января 2012

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

Например, в Windows $ _SERVER ['Path'] выглядит так, как вы видите, с первой буквой в верхнем регистре, а не «PATH», как вы могли ожидать.

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

39 голосов
/ 31 января 2014

Я знаю, что комментарий в документации говорит, что 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 может получить переменную окружения тремя способами:

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

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

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

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

  1. Использование getenv.
  2. Используйте правильный регистр для имени переменной среды.
31 голосов
/ 10 января 2012

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

С другой стороны, getenv() обращается кнепосредственно в окружение

4 голосов
/ 16 ноября 2016

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

3 голосов
/ 10 января 2012

Взято из PHP документации :

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

1 голос
/ 13 марта 2018

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

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