getenv () vs. $ _ENV in PHP

84

Was ist der Unterschied zwischen getenv()und$_ENV ?

Irgendwelche Kompromisse zwischen der Verwendung von beidem?

Mir ist aufgefallen, dass ich manchmal getenv()das bekomme, was ich brauche, während ich $_ENVes nicht tue (wie HOME).

Tau
quelle
1
Lassen Sie sich nicht von PHP fangen, das die blutigen Details vor Ihnen verbirgt. $_ENVund $_SERVERwerden mit Daten gefüllt, die auf verschiedene Weise erhalten wurden. getenv()ist eine weitere Möglichkeit, auf Daten zuzugreifen, auf die Sie mit PHP nicht direkt zugreifen können. Es funktioniert auch mit variables_order = "G", wenn $_SERVERund $_ENVleer sind. Lesen Sie die großartige Antwort von Conor McDermottroe .
Palec
Für diejenigen, die das Symfony-Framework verwenden, gibt es einen weiteren begrenzten Fall. getenv () gibt immer den Wert der env-Variablen zurück, wie er beim Start des PHP-Servers war, auch wenn er danach geändert wurde. Während $ _ENV [] zur Laufzeit durch Ändern von .env-Dateien geändert werden kann. Aber natürlich bezieht es sich auf Symfony und nicht auf PHP im Allgemeinen.
Ross Ivantsiv

Antworten:

58

Laut der PHP-Dokumentation zu getenv sind sie genau gleich, außer dass getenvdie Variable ohne Berücksichtigung der Groß- und Kleinschreibung gesucht wird. Meistens spielt es wahrscheinlich keine Rolle, aber einer der Kommentare in der Dokumentation erklärt:

Unter Windows ist $ _SERVER ['Pfad'] beispielsweise so, wie Sie sehen, wobei der erste Buchstabe groß geschrieben wird und nicht 'PATH', wie Sie es vielleicht erwarten.

Aus diesem Grund würde ich mich wahrscheinlich für die Verwendung entscheiden, es getenvsei denn, Sie sind sich sicher, dass der Titel der Variablen, die Sie abrufen möchten, in Groß- und Kleinschreibung geschrieben ist.

Batkins
quelle
14
Erklärt nicht, warum $ _ENV ("FOO") und getenv ("FOO") unterschiedliche Ergebnisse zurückgeben.
Rich Remer
Zusätzlicher getenv()Vorteil: Sie müssen isset/ emptyvor dem Zugriff nicht überprüfen . getenv()wird keine Mitteilungen ausgeben.
Steve Clay
51

Ich weiß, dass der Kommentar in den Dokumenten besagt, dass getenvdie Groß- und Kleinschreibung nicht berücksichtigt wird, aber das ist nicht das Verhalten, das ich sehe:

> 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

Wenn Sie sich den Quellcode für die getenvFunktion ansehen, gibt es drei Möglichkeiten, wie PHP die Umgebungsvariable abrufen kann:

  1. Via sapi_getenv(z. B. wenn die Umgebungsvariable von Apache abgerufen wird)
  2. Wenn unter Windows, von GetEnvironmentVariableA .
  3. Wenn nicht unter Windows, über die getenvvon libc.

Soweit ich das beurteilen kann, verhält sich Windows nur dann ohne Berücksichtigung der Groß- und Kleinschreibung, da sich die Windows-API für Umgebungsvariablen so verhält. Wenn Sie unter Linux, BSD, Mac usw. arbeiten, getenvwird immer noch zwischen Groß- und Kleinschreibung unterschieden.

Wie von Mario erwähnt , $_ENVwird es aufgrund unterschiedlicher Konfigurationen nicht immer ausgefüllt.variables_order Vermeiden $_ENVSie es daher, wenn Sie die Serverkonfiguration nicht steuern.

Also, für den portabelsten PHP-Code:

  1. Verwenden Sie getenv.
  2. Verwenden Sie die richtige Groß- und Kleinschreibung für den Namen der Umgebungsvariablen.
Conor McDermottroe
quelle
35

Darüber hinaus $_ENVist in der Regel leer, wenn variables_ordernicht Eaufgeführt. Bei vielen Setups ist es wahrscheinlich, dass nur diese $_SERVERausgefüllt sind und $_ENVausschließlich für die CLI-Verwendung bestimmt sind.

Zum anderen wird getenv()direkt auf die Umgebung zugegriffen.

(In Bezug auf die Fallmehrdeutigkeit könnte man einfacher verwenden array_change_key_case().)

Mario
quelle
6

Ich fand es getenv()nützlich, einen seltsamen PHP-Fehler zu vermeiden, bei dem manchmal $_SERVERund $_ENVundefiniert, wenn er auto_globals_jitaktiviert war (Erstellen der Variablen _SERVER und _ENV , wenn sie zum ersten Mal verwendet werden). Seitdem habe ich angefangen, es zu benutzen.

Leopoldo Sanczyk
quelle
3

Entnommen aus den PHP-Dokumenten :

Diese Funktion ist nützlich (im Vergleich zu $_SERVER, $_ENV), da sie den Schlüssel $ varname auf diese Weise durchsucht, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird. Unter Windows sehen $_SERVER['Path']Sie PATHbeispielsweise so, als würden Sie Großschreibung sehen, nicht wie erwartet. Also nur:<?php getenv('path') ?>

Ayman Safadi
quelle
3

Ich würde hinzufügen, dass getenv () eine bessere Wahl ist, da es als Funktion zu Testzwecken überladen werden kann. Während das Überschreiben Ihrer $ _SERVER- oder $ _ENV-Variablen möglicherweise Testframeworks und andere Bibliotheken beeinträchtigt und letztendlich viel mehr Arbeit erfordert, um sicher ausgeführt zu werden.

Joe Green
quelle