違いは何であるgetenv()
とは$_ENV
?
どちらかを使用することの間のトレードオフはありますか?
getenv()
必要なものが提供されることもありますが、提供されないこともあります$_ENV
(などHOME
)。
違いは何であるgetenv()
とは$_ENV
?
どちらかを使用することの間のトレードオフはありますか?
getenv()
必要なものが提供されることもありますが、提供されないこともあります$_ENV
(などHOME
)。
回答:
getenvに関するphpのドキュメントによると、getenv
大文字と小文字を区別しない方法で変数を検索することを除いて、まったく同じです。ほとんどの場合、それはおそらく問題ではありませんが、ドキュメントのコメントの1つは次のように説明しています。
たとえば、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が環境変数をフェッチする方法が3つあるためです。
sapi_getenv
(たとえば、Apacheから環境変数を取得している場合)GetEnvironmentVariableA
。getenv
によって提供される関数からlibc
。私の知る限り、大文字と小文字を区別せずに動作するのはWindowsのみです。これは、Windows環境変数APIがそのように動作するためです。Linux、BSD、Macなどを使用している場合getenv
ている場合でも、大文字と小文字は区別されます。
で述べたようにマリオ、$_ENV
いつもの異なる構成のために移入されませんvariables_order
あなたが避ける場合、それがベストですので、$_ENV
サーバー構成を制御しない場合。
したがって、最も移植性の高いPHPコードの場合:
getenv
ます。さらに$_ENV
、リストされvariables_order
てE
いない場合、通常は空です。多くのセットアップで$_SERVER
は、データのみが入力される可能性が高く、$_ENV
CLIでの使用のみを目的としています。
一方getenv()
、環境に直接アクセスします。
(ケースのあいまいさに関しては、もっと単純に採用することができますarray_change_key_case()
。)
有効になっていると未定義になることがあるgetenv()
という奇妙なPHPバグを回避するのに役立つことがわかりました(最初に使用したときに_SERVER変数と_ENV変数を作成します)。それ以来、私はそれを使い始めました。$_SERVER
$_ENV
auto_globals_jit
envを読んで作成する
<?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では直接アクセスできないデータにアクセスするもう1つの方法です。、が空のvariables_order = "G"
場合でも機能します。ConorMcDermottroeによるすばらしい答えを読んでください。$_SERVER
$_ENV