Arasındaki fark nedir getenv()
ve $_ENV
?
İkisini de kullanmak arasında herhangi bir denge var mı?
Fark ettim ki bazen getenv()
bana ihtiyacım olanı verirken $_ENV
vermiyor (gibi HOME
).
Arasındaki fark nedir getenv()
ve $_ENV
?
İkisini de kullanmak arasında herhangi bir denge var mı?
Fark ettim ki bazen getenv()
bana ihtiyacım olanı verirken $_ENV
vermiyor (gibi HOME
).
Yanıtlar:
Getenv ile ilgili php belgelerine göre getenv
, değişkeni büyük / küçük harfe duyarsız bir şekilde aramaları dışında tamamen aynıdır . Çoğu zaman büyük olasılıkla önemli değildir, ancak belgelerdeki yorumlardan biri açıklıyor:
Örneğin, Windows $ _SERVER ['Yol'], gördüğünüz gibi, beklediğiniz gibi 'PATH' değil, ilk harf büyük olacak şekilde.
Bu nedenle getenv
, almaya çalıştığınız değişkenin büyük / küçük harf durumundan emin değilseniz, muhtemelen kullanmayı tercih ederim.
getenv()
avantaj: erişimden önce isset
/ kontrol etmenize gerek yoktur empty
. getenv()
bildirimler yayınlamaz.
Belgelerdeki yorumun getenv
büyük / küçük harfe duyarlı olmadığını söylediğini biliyorum , ancak benim gördüğüm davranış bu değil :
> 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
Baktığımızda kaynak kodu için getenv
PHP ortam değişkeni alabilmesi üç yolu vardır çünkü fonksiyonu şudur:
sapi_getenv
(örneğin, Apache'den ortam değişkenini alıyorsa)GetEnvironmentVariableA
.getenv
tarafından sağlanan işlevden libc
.Anlayabildiğim kadarıyla, büyük / küçük harfe duyarsız bir şekilde davranacağı tek zaman Windows üzerindedir, çünkü Windows ortam değişkeni API'si böyle davranır. Linux, BSD, Mac, vb. Kullanıyorsanız getenv
, yine de büyük / küçük harfe duyarlıdır.
Mario tarafından belirtildiği gibi , $_ENV
farklı yapılandırmalar nedeniyle her zaman doldurulmaz, variables_order
bu nedenle $_ENV
sunucu yapılandırmasını kontrol etmiyorsanız kaçınmanız en iyisidir .
Yani, en taşınabilir PHP kodu için:
getenv
.Ayrıca $_ENV
eğer tipik boş olduğu variables_order
does't var E
listelenmiş. Çoğu kurulumda muhtemelen yalnızca $_SERVER
doldurulmuş ve $_ENV
kesinlikle CLI kullanımı içindir.
Diğer yandan getenv()
ortama doğrudan erişir.
(Durum belirsizliği ile ilgili olarak, kişi daha basit bir şekilde kullanılabilir array_change_key_case()
.)
Etkinleştirildiğinde bazen tanımlanmamış ve tanımlanmamış garip bir PHP hatasındangetenv()
kaçınmak için yararlı buldum ( ilk kullanıldığında _SERVER ve _ENV değişkenlerini oluşturmak ). O zamandan beri kullanmaya başladım.$_SERVER
$_ENV
auto_globals_jit
Alındığı PHP docs :
Bu fonksiyon, (göre yararlıdır
$_SERVER
,$_ENV
bu o dizi harf duyarlı bir şekilde $ değişken anahtarını arar için). Örneğin Windows'ta beklediğiniz gibi$_SERVER['Path']
değil, Büyük Harfli'yi gördüğünüz gibidirPATH
. Bu yüzden sadece:<?php getenv('path') ?>
Getenv () 'nin daha iyi bir seçim olduğunu eklemeliyim, çünkü bir işlev olarak test amacıyla aşırı yüklenebilir. Oysa $ _SERVER veya $ _ENV değişkenlerinizin üzerine yazmak, test çerçevelerini ve diğer kitaplıkları engelleyebilir ve sonuçta güvenli bir şekilde yürütmek için çok daha fazla çalışma gerektirebilir.
env oku ve oluştur
<?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
ve$_SERVER
çeşitli yollarla elde edilen verilerle doldurulur.getenv()
PHP'nin doğrudan erişmenizi sağlamadığı verilere erişmenin başka bir yoludur. Hatta ile çalışırvariables_order = "G"
, ne zaman$_SERVER
ve$_ENV
boştur. Conor McDermottroe'nun harika cevabını okuyun .