Warum ist mein $ _ENV leer?

78

Ich laufe Apache/2.2.11 (Win32) PHP/5.3.0und habe in meiner .htaccess-Datei Folgendes getan:

SetEnv FOO bar

Wenn ich die $_ENVVariable in einer PHP-Datei drucke, erhalte ich ein leeres Array. Warum wird meine Umgebungsvariable dort nicht angezeigt? Warum ist es überhaupt leer?

Ich habe meine Variable zwar gefunden, aber sie erscheint in der $_SERVERVariablen. Und aus irgendeinem Grund erscheint es zweimal, irgendwie. Warum ist das?

[REDIRECT_FOO] => bar
[FOO] => bar

Es scheint, dass ich es mit bekommen kann getenv('FOO'), also sollte ich das vielleicht stattdessen einfach benutzen. Aber ich bin immer noch ein bisschen neugierig, was das verursacht. Ist das ein Windows-Problem? Oder was ist los?

Svish
quelle
2
Kein Windows-Problem, es ist dasselbe unter Linux (mit PHP als Modul). Ich bin mir über die Details nicht sicher, aber es kann sein, dass die Umgebung des Webservers nicht mit der von PHP identisch ist, und deshalb wird er als $_SERVERvar gesendet . Ich würde meine Stimme für die Verwendung abgeben, bei getenv()der beide, soweit ich weiß, nur zwischen Groß- und Kleinschreibung unterscheiden.
Wrikken
1
Auf einer Seite Anmerkung: die CLI - Instanz tut es bekommen $_ENV.
Wrikken
@svish Dein Update hat mir geholfen. Wenn Sie es in eine Antwort ändern würden, würde ich es gerne positiv bewerten.
Dominic Sayers
@svish Ihre in der Frage gepostete Lösung sollte wirklich als Antwort unten gepostet werden. Diese Frage wurde mehrmals als doppeltes nahes Ziel verknüpft, aber die Lösung ist in der Frage fehl am Platz :)
Michael Berkowski
@ MichaelBerkowski Danke für den Hinweis. Gute Idee. Tun Sie es jetzt :)
Svish

Antworten:

116

Es stellte sich heraus, dass es hier zwei Probleme gab:

1. $_ENVwird nur ausgefüllt, wenn php.ini dies zulässt , was standardmäßig nicht der Fall zu sein scheint, zumindest nicht in der Standardinstallation des WAMP-Servers .

; This directive determines which super global arrays are registered when PHP
; starts up. If the register_globals directive is enabled, it also determines
; what order variables are populated into the global space. G,P,C,E & S are
; abbreviations for the following respective super globals: GET, POST, COOKIE,
; ENV and SERVER. There is a performance penalty paid for the registration of
; these arrays and because ENV is not as commonly used as the others, ENV is
; is not recommended on productions servers. You can still get access to
; the environment variables through getenv() should you need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"

Wenn ich den variables_orderRücken auf setze EGPCS, $_ENVist nicht mehr leer.

2. Wenn Sie SetEnvin Ihrem verwenden .htaccess, endet es in $_SERVER, nicht in$_ENV , was ich sagen muss, ist ein bisschen verwirrend, wenn es benannt wird SetEnv...

# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/

# php
var_dump($_SERVER['ENV'], $_SERVER['BASE']);

// string 'dev' (length=3)
// string '/ssl/' (length=5)

3. Die getenvFunktion funktioniert immer und wird von der PHP-Einstellung für $ _ENV nicht beeinflusst. Außerdem scheint sie dies unabhängig von Groß- und Kleinschreibung zu tun, was nützlich sein könnte.

var_dump(getenv('os'), getenv('env'));

// string 'Windows_NT' (length=10)
// string 'dev' (length=3)
Svish
quelle
6
AGGH! Ich danke dir sehr!!! Du hast keine Ahnung, wie lange ich schon gegoogelt habe, als ich dachte, es gäbe ein Problem mit mod_env oder so. Ich habe variables_order komplett vergessen! Danke, dass du großartig bist !!!
Marcel
1
Scheint, als ob der Wert jetzt ohne Anführungszeichen gesetzt werden sollte. (Fehler PHP: syntax error, unexpected '"' in php.ini)
Yanot
1
Vielen Dank! Können Sie dies in drei Antworten aufteilen, damit ich es dreimal positiv bewerten kann? : D
Doug McLean
12

$_ENV Variablen werden aus der Umgebung importiert, unter der PHP ausgeführt wird. Abhängig von Ihrem Setup (Betriebssystem, Server, ob PHP als Apache-Modul oder unter FastCGI usw. ausgeführt wird) kann dies sehr unterschiedlich sein.

IIRC in einer Standardinstallation von Apache + mod_php unter Windows besteht die einzige Möglichkeit zum Ändern von Variablen darin $_ENV, die Umgebungsvariablen von Windows zu ändern (siehe dies ). Dies kann beim Umgang mit PHP-Erweiterungen unter Windows von Bedeutung sein, da einige von ihnen (z. B. php_ldap:) nur über Umgebungsvariablen konfiguriert werden können $_ENV.

NullUserException
quelle
1

REDIRECT_*Variablen werden angezeigt, wenn Sie RewriteRules verwenden. Auf meinem Server erscheinen sie auch nur so. Es könnte etwas damit zu tun haben, unter FastCGI zu laufen. In Kombination mit suexec wird dadurch höchstwahrscheinlich der gesamte Umgebungsvariablenpool bereinigt. PassEnvInsbesondere ist möglicherweise eine zusätzliche Konfiguration erforderlich, um sie wiederherzustellen . Ich habe keine Ahnung, warum getenv () für Sie funktioniert. Alle Phänomene sind jedoch spezifisch für Ihre Server- und PHP-Konfiguration. Fragen Sie bei Serverfehler, sie sollten es wissen.

Mario
quelle
Aha. Ich vermutete, dass das Rewrite-Modul etwas damit zu tun haben könnte. Ich kann mir nur nicht vorstellen, warum das so ist. Aber ich bin sicher, Apache hat seine Gründe: p (oder Fehler)
Svish
2
Für den Fall, dass Sie den Schlaf verloren haben, warum getenvgearbeitet hat: Ich habe gerade herausgefunden, dass es anscheinend sucht $_ENV und $_SERVER : p
Svish