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
).
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 exemplo, no Windows $ _SERVER ['Path'] é como você vê, com a primeira letra maiúscula, não 'PATH' como você pode esperar.
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.
getenv()
Vantagem adicional : você não precisa verificar isset
/ 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 por libc
.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
.Além disso, $_ENV
normalmente está vazio se variables_order
não estiver E
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()
.)
Achei getenv()
útil evitar um bug estranho do PHP onde às vezes $_SERVER
e $_ENV
era indefinido se auto_globals_jit
estava habilitado (criando as variáveis _SERVER e _ENV quando são usadas pela primeira vez). Desde então comecei a usar.
Retirado dos documentos PHP :
Esta função é útil (comparada com
$_SERVER
,$_ENV
) porque pesquisa a chave $ varname daquela maneira de array que não diferencia maiúsculas de minúsculas. Por exemplo, no Windows$_SERVER['Path']
é como ver Capitalizado, não 'PATH
' como você esperava. Então apenas:<?php getenv('path') ?>
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.
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);
}
}
?>
$_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 .