109 votes

getenv() vs. $_ENV en PHP

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

Y a-t-il des inconvénients à utiliser l'un ou l'autre ?

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

1 votes

Ne vous laissez pas piéger par PHP qui vous cache les détails sanglants. $_ENV y $_SERVER sont alimentés par des données obtenues de diverses manières. getenv() est un autre moyen d'accéder à des données auxquelles PHP ne vous permet pas d'accéder directement. Cela fonctionne même avec variables_order = "G" quand $_SERVER y $_ENV sont vides. Lisez l'excellente réponse de Conor McDermottroe .

0 votes

5 votes

Pour ceux qui utilisent le framework Symfony, il existe un cas plus limité de ce qui précède. getenv() retournera toujours la valeur de la variable env telle qu'elle était au démarrage du serveur php, même si elle a été modifiée par la suite. Alors que $_ENV[] peut être changé en cours d'exécution en modifiant les fichiers .env. Mais bien sûr, cela concerne Symfony, et non PHP en général.

71voto

Batkins Points 2482

Selon la documentation php sur getenv ils sont exactement les mêmes, sauf que getenv recherchera la variable sans tenir compte de la casse lorsqu'il fonctionne sur des systèmes de fichiers insensibles à la casse (comme Windows). Sur les hôtes Linux, elle fonctionne toujours en respectant la casse. La plupart du temps, cela n'a probablement pas d'importance, mais l'un des commentaires de la documentation l'explique :

Par exemple, sous Windows, $_SERVER['Path'] ressemble à ce que vous voyez, avec la première lettre en majuscule, et non pas 'PATH' comme vous pourriez vous y attendre.

Pour cette raison, je choisirais probablement d'utiliser getenv pour améliorer le comportement multiplateforme, à moins que vous ne soyez certain de la casse de la variable d'environnement que vous essayez de récupérer.

Steve Clay Le commentaire de l'auteur de cette réponse souligne une autre différence :

Ajouté getenv() avantage : vous n'avez pas besoin de vérifier isset / empty avant l'accès. getenv() n'émettra pas d'avis.

21 votes

N'explique pas pourquoi $_ENV("FOO") et getenv("FOO") renvoient des résultats différents.

3 votes

Ajouté getenv() avantage : vous n'avez pas besoin de vérifier isset / empty avant l'accès. getenv() n'émettra pas d'avis.

57voto

Je sais que le commentaire dans la documentation dit que getenv est insensible à la casse, mais c'est pas le comportement que je constate :

> 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

Regarder le code source pour les getenv c'est parce qu'il y a trois façons pour PHP de récupérer la variable d'environnement :

  1. Via sapi_getenv (par exemple, s'il obtient la variable d'environnement d'Apache)
  2. Si vous êtes sous Windows, à partir de GetEnvironmentVariableA .
  3. Si vous n'êtes pas sous Windows, à partir de la page getenv fournie par libc .

Pour autant que je sache, le seul cas où la sensibilité à la casse est respectée est celui de Windows, car c'est ainsi que se comporte l'API des variables d'environnement de Windows. Si vous êtes sous Linux, BSD, Mac, etc. getenv est toujours sensible à la casse.

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

Donc, pour le code PHP le plus portable :

  1. Utilisation getenv .
  2. Utilisez la bonne casse pour le nom de la variable d'environnement.

45voto

mario Points 76989

En outre $_ENV est généralement vide si variables_order n'a pas E répertoriée. Dans de nombreuses configurations, il est probable que seuls les $_SERVER est alimenté, et $_ENV est strictement réservé à l'utilisation de l'interface de programmation.

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

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

6voto

Leopoldo Sanczyk Points 124

J'ai trouvé getenv() utile pour éviter un étrange bug PHP où parfois $_SERVER y $_ENV était indéfini si auto_globals_jit a été activé (en créant le _SERVER y _ENV lorsqu'elles sont utilisées pour la première fois). Depuis, j'ai commencé à l'utiliser.

3voto

Joe Green Points 1029

J'ajouterais que getenv() est un meilleur choix car, en tant que fonction, elle peut être surchargée à des fins de test. Alors que le fait de surcharger vos variables $_SERVER ou $_ENV pourrait interférer avec les frameworks de test et d'autres bibliothèques et nécessiterait finalement beaucoup plus de travail pour être effectué en toute sécurité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X