getenv()
和之间有什么区别$_ENV
?
使用两者之间是否有任何取舍?
我注意到有时getenv()
会给我我需要的东西,而不需要的$_ENV
(例如HOME
)。
getenv()
和之间有什么区别$_ENV
?
使用两者之间是否有任何取舍?
我注意到有时getenv()
会给我我需要的东西,而不需要的$_ENV
(例如HOME
)。
Answers:
根据有关getenv的php文档,它们完全相同,除了getenv
会以不区分大小写的方式查找变量。在大多数情况下,这可能并不重要,但是文档中的其中一项评论解释了:
例如,在Windows上,$ _ SERVER ['Path']就像您看到的那样,首字母大写,而不是您期望的'PATH'。
因此,getenv
除非您对要检索的变量标题的大小写不确定,否则我可能会选择使用。
getenv()
优点:您无需在访问前检查isset
/ empty
。getenv()
不会发出通知。
我知道文档中的注释说不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
纵观源代码的getenv
功能,这是因为有三种方法PHP可以获取环境变量:
sapi_getenv
(例如,如果从Apache获取环境变量)GetEnvironmentVariableA
。getenv
提供的功能libc
。据我所知,它唯一不区分大小写的方式是在Windows上,因为这就是Windows环境变量API的方式。如果您使用的是Linux,BSD,Mac等,则getenv
仍然区分大小写。
正如mario所提到的,$_ENV
由于的配置不同,并不总是填充,variables_order
所以最好避免$_ENV
如果您不控制服务器配置。
因此,对于最可移植的PHP代码:
getenv
。另外$_ENV
通常是空的,如果variables_order
简化版,已经E
上市。在许多设置中,可能只有$_SERVER
填充,并且$_ENV
仅用于CLI。
另一方面getenv()
直接访问环境。
(关于大小写含糊,可以更简单地使用array_change_key_case()
。)
取自PHP docs:
此功能很有用(与相比
$_SERVER
,$_ENV
),因为它以不区分大小写的数组形式搜索$ varname键。例如,在Windows$_SERVER['Path']
上,您看到的是大写字母,而不是PATH
您期望的' '。所以就:<?php getenv('path') ?>
阅读环境并创建
<?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
并$_SERVER
填充以各种方式获得的数据。getenv()
这是另一种访问数据的方法,PHP不允许您直接访问数据。即使和variables_order = "G"
,当$_SERVER
和$_ENV
为空时也可以使用。阅读Conor McDermottroe的精彩回答。