PHP में getenv () बनाम $ _ENV


88

बीच क्या अंतर है getenv()और $_ENV?

या तो उपयोग करने के बीच कोई व्यापार?

मैंने देखा कि कभी-कभी getenv()मुझे वह मिलता है जो मुझे चाहिए, जबकि $_ENVऐसा नहीं है (जैसे कि HOME)।


1
PHP द्वारा आपके द्वारा किए गए गोरे विवरणों को छिपाकर मत फंसो। $_ENVऔर $_SERVERविभिन्न तरीकों से प्राप्त आंकड़ों से आबाद हैं। getenv()अभी तक डेटा एक्सेस करने का एक और तरीका है कि PHP आपको सीधे एक्सेस करने में सक्षम नहीं करता है। यह भी साथ काम करता है variables_order = "G", जब $_SERVERऔर $_ENVखाली हैं। Conor McDermottroe द्वारा शानदार जवाब पढ़ें ।
पालिक


उन लोगों के लिए, जो सिम्फनी फ्रेमवर्क का उपयोग कर रहे हैं, उपरोक्त में से एक और सीमित मामला है। getenv () हमेशा env वैरिएबल के मान को लौटाएगा क्योंकि यह तब था जब php सर्वर शुरू हुआ था, भले ही बाद में इसे बदल दिया गया हो। जबकि $ _ENV [] .env फ़ाइलों को संशोधित करके रनटाइम में बदला जा सकता है। लेकिन निश्चित रूप से यह सिम्फनी से संबंधित है, और सामान्य रूप से PHP नहीं है।
रॉस इवांटिविस

जवाबों:


59

Getenv के बारे में php प्रलेखन के अनुसार , वे बिल्कुल समान हैं, सिवाय इसके कि getenvकेस-असंवेदनशील तरीके से चर की तलाश करेंगे। ज्यादातर समय यह शायद कोई फर्क नहीं पड़ता, लेकिन प्रलेखन पर टिप्पणियों में से एक बताते हैं:

उदाहरण के लिए विंडोज पर $ _SERVER ['पथ'] जैसा कि आप देख रहे हैं, पहले अक्षर को बड़े अक्षरों में लिखा गया है, न कि 'पथ' जैसा कि आप उम्मीद कर सकते हैं।

उसके कारण, मैं शायद getenvतब तक उपयोग करने का विकल्प चुनूंगा जब तक कि आप उस चर के शीर्षक के आवरण के बारे में निश्चित न हों, जिसे आप पुनर्प्राप्त करने का प्रयास कर रहे हैं।


14
यह नहीं समझाता है कि $ _ENV ("FOO") और getenv ("FOO") अलग-अलग परिणाम क्यों लौटाते हैं।
अमीर रेसर

जोड़ा getenv()लाभ: आप का उपयोग करने से पहले isset/ जाँच की जरूरत नहीं है emptygetenv()नोटिस नहीं भेजे जाएंगे।
स्टीव क्ले

53

मुझे पता है कि डॉक्स में टिप्पणी कहती है कि 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 वातावरण चर लाने कर सकते हैं:

  1. वाया sapi_getenv(जैसे अगर यह अपाचे से पर्यावरण चर रहा है)
  2. अगर विंडोज पर, से GetEnvironmentVariableA
  3. यदि गैर-विंडोज पर, getenvद्वारा प्रदान किए गए फ़ंक्शन से libc

जहाँ तक मैं बता सकता हूँ, एक ही समय जब यह केस-असंवेदनशील तरीके से व्यवहार करेगा, विंडोज पर है, क्योंकि विंडोज पर्यावरण चर एपीआई कैसे व्यवहार करता है। यदि आप लिनक्स, बीएसडी, मैक आदि पर हैं, तब getenvभी मामला संवेदनशील है।

जैसा कि mario द्वारा बताया गया है , $_ENVहमेशा अलग-अलग कॉन्फ़िगरेशन के कारण आबाद नहीं होता है variables_orderइसलिए $_ENVयदि आप सर्वर कॉन्फ़िगरेशन को नियंत्रित नहीं करते हैं तो यह सबसे अच्छा है।

तो, सबसे पोर्टेबल PHP कोड के लिए:

  1. का उपयोग करें getenv
  2. पर्यावरण चर नाम के लिए सही मामले का उपयोग करें।

36

सूचीबद्ध नहीं होने के साथ $_ENVही आमतौर पर खाली है । कई सेटअप पर यह संभावना है कि केवल आबादी है, और सीएलआई उपयोग के लिए सख्ती से है।variables_orderE$_SERVER$_ENV

दूसरी ओर getenv()सीधे पर्यावरण तक पहुँचता है।

(केस-अस्पष्टता के संबंध में, कोई और अधिक आसानी से नियोजित कर सकता है array_change_key_case()।)


6

मुझे getenv()एक अजीब PHP बग से बचने के लिए उपयोगी पाया गया था जहां कभी-कभी $_SERVERऔर $_ENVअपरिभाषित होता auto_globals_jitथा यदि सक्षम किया गया था ( _SERVER बनाने के लिए) जब वे पहली बार उपयोग किए जाते हैं तो और _ENV चर बनाते हैं)। तब से मैंने इसका इस्तेमाल करना शुरू कर दिया।


3

PHP डॉक्स से लिया गया :

यह फ़ंक्शन उपयोगी है (तुलना में ) $_SERVER, $_ENVक्योंकि यह उन सरणी केस-असंवेदनशील तरीके से $ varname कुंजी खोजता है। उदाहरण के लिए विंडोज़ $_SERVER['Path']पर जैसे आप कैपिटलाइज़्ड देखते हैं, न कि ' PATH' जैसा कि आप उम्मीद करते हैं। बस ऐसे:<?php getenv('path') ?>


3

मुझे लगता है कि getenv () एक बेहतर विकल्प है क्योंकि, एक समारोह के रूप में, यह परीक्षण प्रयोजनों के लिए अतिभारित किया जा सकता है। जबकि आपके $ _SERVER या $ _ENV चर को अधिलेखित करने से परीक्षण ढांचे और अन्य पुस्तकालयों में हस्तक्षेप हो सकता है और अंततः सुरक्षित रूप से बाहर ले जाने के लिए बहुत अधिक कार्य की आवश्यकता होती है।


0

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);
    }
}
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.