Quelle est la différence entre getenv()
et $_ENV
?
Des compromis entre l'utilisation de l'un ou l'autre?
J'ai remarqué que parfois getenv()
me donne ce dont j'ai besoin, alors $_ENV
que non (comme HOME
).
Quelle est la différence entre getenv()
et $_ENV
?
Des compromis entre l'utilisation de l'un ou l'autre?
J'ai remarqué que parfois getenv()
me donne ce dont j'ai besoin, alors $_ENV
que non (comme HOME
).
$_ENV
et$_SERVER
sont remplis de données obtenues de diverses manières.getenv()
est encore un autre moyen d'accéder aux données auxquelles PHP ne vous permet pas d'accéder directement. Cela fonctionne même avecvariables_order = "G"
, quand$_SERVER
et$_ENV
sont vides. Lisez la grande réponse de Conor McDermottroe .Réponses:
Selon la documentation php sur getenv , ils sont exactement les mêmes, sauf que
getenv
chercher la variable d'une manière insensible à la casse. La plupart du temps, cela n'a probablement pas d'importance, mais l'un des commentaires sur la documentation explique:Pour cette raison, j'opterais probablement pour l'utilisation à
getenv
moins que vous ne soyez certain de la casse du titre de la variable que vous essayez de récupérer.la source
getenv()
Avantage supplémentaire : vous n'avez pas besoin de vérifierisset
/empty
avant l'accès.getenv()
n'émettra pas d'avis.Je sais que le commentaire dans la documentation dit que ce
getenv
n'est pas sensible à la casse, mais ce n'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 de la
getenv
fonction, c'est parce que PHP peut récupérer la variable d'environnement de trois manières:sapi_getenv
(par exemple, s'il obtient la variable d'environnement d'Apache)GetEnvironmentVariableA
.getenv
fonction fournie parlibc
.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., il
getenv
est toujours sensible à la casse.Comme mentionné par mario ,
$_ENV
n'est pas toujours peuplé en raison de différentes configurationsvariables_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:
getenv
.la source
De plus, il
$_ENV
est généralement vide s'ilvariables_order
n'est pasE
répertorié. Sur de nombreuses configurations, il est probable que seul$_SERVER
est rempli et$_ENV
est strictement réservé à l'utilisation de la 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()
.)la source
J'ai trouvé
getenv()
utile d'éviter un étrange bogue PHP où parfois$_SERVER
et$_ENV
n'était pas défini siauto_globals_jit
était activé (création des variables _SERVER et _ENV lors de leur première utilisation). Depuis, j'ai commencé à l'utiliser.la source
Tiré de la documentation PHP :
la source
J'ajouterais que getenv () est un meilleur choix car, en tant que fonction, il peut être surchargé à des fins de test. Tandis que l'écrasement de vos variables $ _SERVER ou $ _ENV peut interférer avec les frameworks de test et d'autres bibliothèques et finalement nécessiter beaucoup plus de travail pour être effectué en toute sécurité.
la source
lire env et créer
<?php namespace neoistone; class ns_env { /** * env to array file storage * * @param $envPath */ public static function envToArray(string $envPath) { $variables = []; $mread = fopen($envPath, "r"); $content = fread($mread,filesize($envPath)); fclose($mread); $lines = explode("\n", $content); if($lines) { foreach($lines as $line) { // If not an empty line then parse line if($line !== "") { // Find position of first equals symbol $equalsLocation = strpos($line, '='); // Pull everything to the left of the first equals $key = substr($line, 0, $equalsLocation); // Pull everything to the right from the equals to end of the line $value = substr($line, ($equalsLocation + 1), strlen($line)); $variables[$key] = $value; } else { $variables[] = ""; } } } return $variables; } /** * Array to .env file storage * * @param $array * @param $envPath */ public static function arrayToEnv(array $array, string $envPath) { $env = ""; $position = 0; foreach($array as $key => $value) { $position++; // If value isn't blank, or key isn't numeric meaning not a blank line, then add entry if($value !== "" || !is_numeric($key)) { // If passed in option is a boolean (true or false) this will normally // save as 1 or 0. But we want to keep the value as words. if(is_bool($value)) { if($value === true) { $value = "true"; } else { $value = "false"; } } // Always convert $key to uppercase $env .= strtoupper($key) . "=" . $value; // If isn't last item in array add new line to end if($position != count($array)) { $env .= "\n"; } } else { $env .= "\n"; } } $mwrite = fopen($envPath, "w"); fwrite($mwrite, $env); fclose($mwrite); } /** * Json to .env file storage * * @param $json * @param $envPath */ public static function JsonToEnv(array $json, string $envPath) { $env = ""; $position = 0; $array = json_decode($json,true); foreach($array as $key => $value) { $position++; // If value isn't blank, or key isn't numeric meaning not a blank line, then add entry if($value !== "" || !is_numeric($key)) { // If passed in option is a boolean (true or false) this will normally // save as 1 or 0. But we want to keep the value as words. if(is_bool($value)) { if($value === true) { $value = "true"; } else { $value = "false"; } } // Always convert $key to uppercase $env .= strtoupper($key) . "=" . $value; // If isn't last item in array add new line to end if($position != count($array)) { $env .= "\n"; } } else { $env .= "\n"; } } $mwrite = fopen($envPath, "w"); fwrite($mwrite, $env); fclose($mwrite); } /** * XML to .env file storage * * @param $json * @param $envPath */ public static function XmlToEnv(array $xml, string $envPath) { $env = ""; $position = 0; $array = simplexml_load_string($xml); foreach($array as $key => $value) { $position++; // If value isn't blank, or key isn't numeric meaning not a blank line, then add entry if($value !== "" || !is_numeric($key)) { // If passed in option is a boolean (true or false) this will normally // save as 1 or 0. But we want to keep the value as words. if(is_bool($value)) { if($value === true) { $value = "true"; } else { $value = "false"; } } // Always convert $key to uppercase $env .= strtoupper($key) . "=" . $value; // If isn't last item in array add new line to end if($position != count($array)) { $env .= "\n"; } } else { $env .= "\n"; } } $mwrite = fopen($envPath, "w"); fwrite($mwrite, $env); fclose($mwrite); } } ?>
la source