Qual é a diferença entre getenv()
e $_ENV
?
Alguma compensação entre usar um ou outro?
Percebi que às vezes getenv()
me dá o que preciso, enquanto $_ENV
não (como HOME
).
Qual é a diferença entre getenv()
e $_ENV
?
Alguma compensação entre usar um ou outro?
Percebi que às vezes getenv()
me dá o que preciso, enquanto $_ENV
não (como HOME
).
$_ENV
e$_SERVER
são preenchidos com dados obtidos de várias maneiras.getenv()
é outra forma de acessar dados que o PHP não permite que você acesse diretamente. Funciona mesmo comvariables_order = "G"
, quando$_SERVER
e$_ENV
estão vazios. Leia a ótima resposta de Conor McDermottroe .Respostas:
De acordo com a documentação php sobre getenv , eles são exatamente os mesmos, exceto que
getenv
irão procurar a variável de uma maneira que não diferencia maiúsculas de minúsculas. Na maioria das vezes, provavelmente não importa, mas um dos comentários na documentação explica:Por causa disso, provavelmente optaria por usar, a
getenv
menos que você tenha certeza sobre a capitalização do título da variável que está tentando recuperar.fonte
getenv()
Vantagem adicional : você não precisa verificarisset
/empty
antes de acessar.getenv()
não emitirá avisos.Eu sei que o comentário na documentação diz que não diferencia
getenv
maiúsculas de minúsculas, mas esse não é o comportamento que estou vendo:> 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
Olhando para o código-fonte da
getenv
função, isso ocorre porque existem três maneiras que o PHP pode buscar a variável de ambiente:sapi_getenv
(por exemplo, se está obtendo a variável de ambiente do Apache)GetEnvironmentVariableA
.getenv
função fornecida porlibc
.Pelo que eu posso dizer, o único momento em que ele se comportará de uma maneira que não diferencia maiúsculas de minúsculas é no Windows, porque é assim que a API de variável de ambiente do Windows se comporta. Se você estiver no Linux, BSD, Mac, etc, então
getenv
ainda diferencia maiúsculas de minúsculas.Como mencionado por mario ,
$_ENV
nem sempre é preenchido devido a configurações diferentes de,variables_order
então é melhor evitar$_ENV
se você não controlar a configuração do servidor.Portanto, para o código PHP mais portátil:
getenv
.fonte
Além disso,
$_ENV
normalmente está vazio sevariables_order
não estiverE
listado. Em muitas configurações, é provável que$_SERVER
seja apenas preenchido e$_ENV
seja estritamente para uso CLI.Por outro lado,
getenv()
acessa o ambiente diretamente.(Em relação à ambiguidade de caso, pode-se empregar de forma mais simples
array_change_key_case()
.)fonte
Achei
getenv()
útil evitar um bug estranho do PHP onde às vezes$_SERVER
e$_ENV
era indefinido seauto_globals_jit
estava habilitado (criando as variáveis _SERVER e _ENV quando são usadas pela primeira vez). Desde então comecei a usar.fonte
Retirado dos documentos PHP :
fonte
Eu acrescentaria que getenv () é uma escolha melhor porque, como uma função, pode ser sobrecarregada para fins de teste. Considerando que a substituição de suas variáveis $ _SERVER ou $ _ENV pode interferir com estruturas de teste e outras bibliotecas e, em última análise, exigir muito mais trabalho para ser executado com segurança.
fonte
leia env e crie
<?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); } } ?>
fonte