बीच क्या अंतर है getenv()और $_ENV?
या तो उपयोग करने के बीच कोई व्यापार?
मैंने देखा कि कभी-कभी getenv()मुझे वह मिलता है जो मुझे चाहिए, जबकि $_ENVऐसा नहीं है (जैसे कि HOME)।
बीच क्या अंतर है getenv()और $_ENV?
या तो उपयोग करने के बीच कोई व्यापार?
मैंने देखा कि कभी-कभी getenv()मुझे वह मिलता है जो मुझे चाहिए, जबकि $_ENVऐसा नहीं है (जैसे कि HOME)।
जवाबों:
Getenv के बारे में php प्रलेखन के अनुसार , वे बिल्कुल समान हैं, सिवाय इसके कि getenvकेस-असंवेदनशील तरीके से चर की तलाश करेंगे। ज्यादातर समय यह शायद कोई फर्क नहीं पड़ता, लेकिन प्रलेखन पर टिप्पणियों में से एक बताते हैं:
उदाहरण के लिए विंडोज पर $ _SERVER ['पथ'] जैसा कि आप देख रहे हैं, पहले अक्षर को बड़े अक्षरों में लिखा गया है, न कि 'पथ' जैसा कि आप उम्मीद कर सकते हैं।
उसके कारण, मैं शायद 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(जैसे अगर यह अपाचे से पर्यावरण चर रहा है)GetEnvironmentVariableA।getenvद्वारा प्रदान किए गए फ़ंक्शन से libc।जहाँ तक मैं बता सकता हूँ, एक ही समय जब यह केस-असंवेदनशील तरीके से व्यवहार करेगा, विंडोज पर है, क्योंकि विंडोज पर्यावरण चर एपीआई कैसे व्यवहार करता है। यदि आप लिनक्स, बीएसडी, मैक आदि पर हैं, तब getenvभी मामला संवेदनशील है।
जैसा कि mario द्वारा बताया गया है , $_ENVहमेशा अलग-अलग कॉन्फ़िगरेशन के कारण आबाद नहीं होता है variables_orderइसलिए $_ENVयदि आप सर्वर कॉन्फ़िगरेशन को नियंत्रित नहीं करते हैं तो यह सबसे अच्छा है।
तो, सबसे पोर्टेबल PHP कोड के लिए:
getenv।सूचीबद्ध नहीं होने के साथ $_ENVही आमतौर पर खाली है । कई सेटअप पर यह संभावना है कि केवल आबादी है, और सीएलआई उपयोग के लिए सख्ती से है।variables_orderE$_SERVER$_ENV
दूसरी ओर getenv()सीधे पर्यावरण तक पहुँचता है।
(केस-अस्पष्टता के संबंध में, कोई और अधिक आसानी से नियोजित कर सकता है array_change_key_case()।)
मुझे getenv()एक अजीब PHP बग से बचने के लिए उपयोगी पाया गया था जहां कभी-कभी $_SERVERऔर $_ENVअपरिभाषित होता auto_globals_jitथा यदि सक्षम किया गया था ( _SERVER बनाने के लिए) जब वे पहली बार उपयोग किए जाते हैं तो और _ENV चर बनाते हैं)। तब से मैंने इसका इस्तेमाल करना शुरू कर दिया।
PHP डॉक्स से लिया गया :
यह फ़ंक्शन उपयोगी है (तुलना में )
$_SERVER,$_ENVक्योंकि यह उन सरणी केस-असंवेदनशील तरीके से $ varname कुंजी खोजता है। उदाहरण के लिए विंडोज़$_SERVER['Path']पर जैसे आप कैपिटलाइज़्ड देखते हैं, न कि 'PATH' जैसा कि आप उम्मीद करते हैं। बस ऐसे:<?php getenv('path') ?>
मुझे लगता है कि getenv () एक बेहतर विकल्प है क्योंकि, एक समारोह के रूप में, यह परीक्षण प्रयोजनों के लिए अतिभारित किया जा सकता है। जबकि आपके $ _SERVER या $ _ENV चर को अधिलेखित करने से परीक्षण ढांचे और अन्य पुस्तकालयों में हस्तक्षेप हो सकता है और अंततः सुरक्षित रूप से बाहर ले जाने के लिए बहुत अधिक कार्य की आवश्यकता होती है।
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 आपको सीधे एक्सेस करने में सक्षम नहीं करता है। यह भी साथ काम करता हैvariables_order = "G", जब$_SERVERऔर$_ENVखाली हैं। Conor McDermottroe द्वारा शानदार जवाब पढ़ें ।