getenv () vs. $ ENV en PHP

Quelle est la différence entre getenv() et $_ENV?

Tout compromis entre l'utilisation de l'un ou l'autre?

J'ai remarqué parfois getenv() me donne ce dont j'ai besoin, alors que $_ENV ne le fait pas (comme HOME).

54
demandé sur Palec 2012-01-10 07:44:23

6 réponses

Selon la documentation php sur la fonction getenv, ils sont exactement les mêmes, sauf que getenv recherchera la variable dans une casse. La plupart du temps, il n'a probablement pas d'importance, mais l'un des commentaires sur la documentation explique:

Par exemple sur Windows $_SERVER ['Path'] est comme vous le voyez, avec la première lettre en majuscule, pas 'PATH' comme vous pouvez vous y attendre.

À cause de cela, je choisirais probablement d'utiliser getenv sauf si vous êtes certain sur le boîtier du titre de la variable que vous essayez de récupérer.

46
répondu Batkins 2012-01-10 03:49:21

Je sais que les commentaires de la doc dit que getenv est insensible à la casse, mais c'est pas le comportement que je vois:

> 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

En regardant le code source pour la fonction getenv, C'est parce QU'il y a trois façons dont PHP peut récupérer la variable d'environnement:

  1. Via sapi_getenv (par exemple s'il obtient la variable D'environnement D'Apache)
  2. si sous Windows, à partir de GetEnvironmentVariableA.
  3. si non-Windows, à partir de la fonction getenv fournie par libc.

Pour autant que je sache, le seul moment où il se comportera de manière insensible à la casse est sous Windows car c'est ainsi que se comporte L'API de la variable D'environnement Windows. Si vous êtes sous Linux, BSD, Mac, etc., getenv est toujours sensible à la casse.

Comme mentionné par mario, $_ENV n'est pas toujours rempli en raison de différentes configurations de variables_order Il est donc préférable d'éviter $_ENV Si vous ne contrôlez pas la configuration du serveur.

Donc, pour le plus portable Code PHP:

  1. utilisez getenv.
  2. utilisez la casse correcte pour le nom de la variable d'environnement.
31
répondu Conor McDermottroe 2017-05-23 11:54:25

En Outre $_ENV est généralement vide si variables_order n'ont pas E répertoriés. Sur de nombreuses configurations, il est probable que seulement $_SERVER est rempli, et $_ENV est strictement pour L'utilisation CLI.

D'autre part getenv() accède directement à l'environnement.

(en ce qui concerne l'ambiguïté de cas, on pourrait plus simplement employer array_change_key_case().)

29
répondu mario 2012-01-10 04:13:25

Extrait des documents PHP :

Cette fonction est utile (par rapport à $_SERVER, $_ENV) parce qu'il recherche la clé $varname de manière insensible à la casse. Par exemple sur Windows $_SERVER['Path'] est comme vous voyez en majuscule, pas 'PATH ' comme prévu. Alors juste: <?php getenv('path') ?>

3
répondu Ayman Safadi 2012-01-10 03:50:02

J'ai trouvé getenv() utile pour éviter un bogue PHP étrange où parfois $_SERVER et $_ENV n'étaient pas définis Si auto_globals_jitétait activé (création des variables _SERVERet _ENV lors de leur première utilisation). Depuis lors, j'ai commencé à l'utiliser.

3
répondu Leopoldo Sanczyk 2016-11-15 21:41:00

J'ajouterais que getenv () est un meilleur choix car, en tant que Fonction, il peut être surchargé à des fins de test. Alors que l'écrasement de vos variables $_SERVER ou $ _ENV pourrait interférer avec les frameworks de test et d'autres bibliothèques et nécessiter finalement beaucoup plus de travail à effectuer en toute sécurité.

0
répondu Joe Green 2018-03-13 17:47:11