web-dev-qa-db-fra.com

Pourquoi mon $ _ENV est-il vide?

J'exécute Apache/2.2.11 (Win32) PHP/5.3.0 et j'ai fait ce qui suit dans mon fichier .htaccess:

SetEnv FOO bar

Si j'imprime la variable $_ENV Dans un fichier PHP, j'obtiens un tableau vide. Pourquoi ma variable d'environnement n'y apparaît-elle pas? Pourquoi est-elle vide en premier lieu ?

J'ai bien trouvé ma variable, mais elle apparaît dans la variable $_SERVER. Et pour une raison quelconque, il apparaît deux fois, en quelque sorte. Pourquoi est-ce?

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

Il semble que je puisse l'obtenir en utilisant getenv('FOO'), alors je devrais peut-être simplement l'utiliser à la place. Mais je suis toujours un peu curieux de savoir ce qui cause cela. Est-ce un problème Windows? Ou que se passe-t-il?

72
Svish

Il s'avère qu'il y avait deux problèmes ici:

1. $_ENV n'est rempli que si php.ini le permet , ce qu'il ne semble pas faire par défaut, du moins pas dans l'installation par défaut serveur WAMP .

; 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"

Lorsque je règle le variables_order retour à EGPCS, $_ENV n'est plus vide.

2. Lorsque vous utilisez SetEnv dans votre .htaccess, il finit dans $_SERVER, pas dedans $_ENV, ce que je dois dire est un peu déroutant quand il est nommé SetEnv...

# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/

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

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

3. La fonction getenv fonctionnera toujours et n'est pas affectée par le paramètre PHP pour $ _ENV De plus, il semble ne pas tenir compte de la casse, ce qui pourrait être utile.

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

// string 'Windows_NT' (length=10)
// string 'dev' (length=3)
95
Svish

$_ENV les variables sont importées de l'environnement dans lequel PHP est en cours d'exécution, et en fonction de votre configuration (le système d'exploitation, votre serveur, si PHP s'exécute) en tant que module Apache ou sous FastCGI, etc.), cela peut varier considérablement.

IIRC dans une installation standard Apache + mod_php sur Windows, la seule façon de changer les variables dans $_ENV consiste à modifier les variables d'environnement de Windows (voir this ). Cela peut être important lorsqu'il s'agit d'extensions PHP sous Windows, car certaines d'entre elles (par exemple: php_ldap ) ne sont configurables que via les variables d'environnement sur $_ENV.

12
NullUserException

REDIRECT_* les variables apparaissent si vous utilisez RewriteRules. Sur mon serveur, ils apparaissent également ainsi. Cela pourrait avoir quelque chose à voir avec l'exécution sous FastCGI. Et s'il est combiné avec suexec, il est plus probable qu'il nettoie le pool de var d'environnement complet. Une configuration supplémentaire peut être nécessaire pour les récupérer, PassEnv en particulier. Quant à savoir pourquoi getenv () fonctionne pour vous, je n'ai aucune idée. Mais tous les phénomènes sont spécifiques à votre configuration serveur et php. Demandez sur serverfault, ils devraient savoir.

1
mario