¿Cuál es la diferencia entre getenv()
y $_ENV
?
¿Alguna compensación entre usar cualquiera?
Me di cuenta de que a veces getenv()
me da lo que necesito, mientras $_ENV
que no (como HOME
).
¿Cuál es la diferencia entre getenv()
y $_ENV
?
¿Alguna compensación entre usar cualquiera?
Me di cuenta de que a veces getenv()
me da lo que necesito, mientras $_ENV
que no (como HOME
).
$_ENV
y$_SERVER
se completan con datos obtenidos de diversas formas.getenv()
es otra forma de acceder a los datos a los que PHP no le permite acceder directamente. Funciona incluso convariables_order = "G"
, cuando$_SERVER
y$_ENV
están vacíos. Lea la gran respuesta de Conor McDermottroe .Respuestas:
De acuerdo con la documentación de php sobre getenv , son exactamente iguales, excepto que
getenv
buscarán la variable sin distinción entre mayúsculas y minúsculas. La mayoría de las veces probablemente no importe, pero uno de los comentarios de la documentación explica:Debido a eso, probablemente optaría por usarlo a
getenv
menos que esté seguro de las mayúsculas y minúsculas del título de la variable que está tratando de recuperar.fuente
getenv()
Ventaja adicional : no es necesario verificarisset
/empty
antes del acceso.getenv()
no emitirá avisos.Sé que el comentario en los documentos dice que
getenv
no distingue entre mayúsculas y minúsculas, pero ese no es el comportamiento que estoy viendo:> 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
Al observar el código fuente de la
getenv
función, esto se debe a que hay tres formas en que PHP puede obtener la variable de entorno:sapi_getenv
(por ejemplo, si obtiene la variable de entorno de Apache)GetEnvironmentVariableA
.getenv
función proporcionada porlibc
.Por lo que puedo decir, el único momento en que se comportará de una manera que no distinga entre mayúsculas y minúsculas es en Windows porque así es como se comporta la API de la variable de entorno de Windows. Si está en Linux, BSD, Mac, etc.,
getenv
todavía distingue entre mayúsculas y minúsculas.Como mencionó mario ,
$_ENV
no siempre se completa debido a las diferentes configuraciones de,variables_order
por lo que es mejor si lo evita$_ENV
si no controla la configuración del servidor.Entonces, para el código PHP más portátil:
getenv
.fuente
Además,
$_ENV
normalmente está vacío sivariables_order
noE
aparece en la lista. En muchas configuraciones, es probable que solo$_SERVER
se complete y$_ENV
sea estrictamente para uso de CLI.Por otro lado
getenv()
accede directamente al entorno.(En cuanto a la ambigüedad del caso, se podría emplear de forma más sencilla
array_change_key_case()
).fuente
Encontré
getenv()
útil para evitar un error extraño de PHP donde a veces$_SERVER
y$_ENV
no estaba definido siauto_globals_jit
estaba habilitado (creando las variables _SERVER y _ENV cuando se usan por primera vez). Desde entonces comencé a usarlo.fuente
Tomado de los documentos PHP :
fuente
Agregaría que getenv () es una mejor opción porque, como función, puede sobrecargarse con fines de prueba. Mientras que sobrescribir sus variables $ _SERVER o $ _ENV podría interferir con los marcos de prueba y otras bibliotecas y, en última instancia, requerir mucho más trabajo para llevarse a cabo de manera segura.
fuente
leer env y crear
<?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); } } ?>
fuente