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

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

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

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

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

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

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

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

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

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

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

Взятые из документов PHP :

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

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