getenv()
和$_ENV
之间的区别是什么?
使用之间的任何权衡?
我注意到有时候getenv()
会向我提供我需要的内容,而$_ENV
却没有(例如HOME
)。
答案 0 :(得分:50)
根据the php documentation about getenv,它们完全相同,只是getenv
将以不区分大小写的方式查找变量。大多数时候它可能无关紧要,但文档中的一条评论解释说:
例如在Windows $ _SERVER ['Path']就像你看到的那样,第一个字母大写,而不是你想象中的'PATH'。
因此,除非您确定要检索的变量标题的大小,否则我可能会选择使用getenv
。
答案 1 :(得分:37)
我知道文档中的评论说getenv
不区分大小写,但不我看到的行为:
> 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
查看the source code getenv
函数,这是因为PHP可以通过三种方式获取环境变量:
sapi_getenv
(例如,如果它从Apache获取环境变量)GetEnvironmentVariableA
。getenv
提供的libc
功能。据我所知,唯一一次它会以不区分大小写的方式运行在Windows上,因为这就是Windows环境变量API的行为方式。如果您使用的是Linux,BSD,Mac等,那么getenv
仍然区分大小写。
正如mario所述,由于$_ENV
的配置不同,variables_order
并不总是已填充,因此如果您不控制服务器,则最好避免使用$_ENV
配置。
因此,对于最便携的PHP代码:
getenv
。答案 2 :(得分:30)
如果$_ENV
未列出E
,则variables_order
通常为空。在许多设置中,可能只填充$_SERVER
,$_ENV
严格用于CLI。
另一方面,getenv()
直接访问环境。
(关于案例歧义,可以更简单地使用array_change_key_case()
。)
答案 3 :(得分:4)
我发现getenv()
对于strange PHP bug非常有用,如果启用了$_SERVER
,有时$_ENV
和auto_globals_jit
未定义(创建 _SERVER < / em>和 _ENV 变量首次使用时)。从那以后我开始使用它。
答案 4 :(得分:2)
取自PHP docs:
此函数很有用(与
$_SERVER
,$_ENV
相比),因为它以那些不区分大小写的方式搜索$ varname键。 例如,在Windows上$_SERVER['Path']
就像您看到的那样大写,而不是您预期的“PATH
”。 所以只需:<?php getenv('path') ?>
答案 5 :(得分:1)
我想补充一点,getenv()是一个更好的选择,因为作为一个函数,它可以被重载以用于测试目的。覆盖$ _SERVER或$ _ENV变量可能会干扰测试框架和其他库,最终需要更多工作才能安全执行。
答案 6 :(得分:0)
阅读环境并创建
<?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);
}
}
?>