В чем разница между 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 может получить переменную окружения:
sapi_getenv
(например, если он получает переменную окружения от Apache) GetEnvironmentVariableA
. getenv
предоставляется libc
. Насколько я могу судить, единственный раз, когда он будет вести себя нечувствительным к регистру, – это Windows, потому что так себя ведет API переменных среды Windows. Если вы работаете в Linux, BSD, Mac и т. Д., getenv
все еще чувствителен к регистру.
Как упоминалось в mario , $_ENV
не всегда заполняется из-за разных конфигураций variables_order
поэтому лучше всего избегать $_ENV
если вы не контролируете конфигурацию сервера.
Итак, для самого портативного PHP-кода:
getenv
. Взятые из документов PHP :
Эта функция полезна (по сравнению с
$_SERVER
,$_ENV
), потому что она ищет ключ $ varname в этом массиве без$_ENV
регистра. Например, в Windows$_SERVER['Path']
как вы ожидали, вы видите «Заглавная», а не «PATH
». Так просто:<?php getenv('path') ?>
Я нашел getenv()
полезным, чтобы избежать странной ошибки PHP, где иногда $_SERVER
и $_ENV
были определены, если включена auto_globals_jit
(создавая переменные _SERVER и _ENV, когда они впервые используются). С тех пор я начал использовать его.