getenv () বনাম PH _ENV পিএইচপি তে


88

মধ্যে পার্থক্য কি getenv()এবং $_ENV?

উভয় ব্যবহারের মধ্যে কোন বাণিজ্য বন্ধ?

আমি লক্ষ্য করেছি যে মাঝে মাঝে getenv()আমার যা প্রয়োজন তা দেয়, যখন $_ENVনা হয় (যেমন HOME)।


4
পিএইচপি আপনার কাছ থেকে বেহাল বিবরণ গোপন করে আটকাবেন না। $_ENVএবং $_SERVERবিভিন্ন উপায়ে প্রাপ্ত ডেটা দিয়ে জনবহুল। getenv()ডেটা অ্যাক্সেস করার আরেকটি উপায় যা পিএইচপি আপনাকে সরাসরি অ্যাক্সেস করতে সক্ষম করে না। এটি variables_order = "G"কখন $_SERVERএবং কখন $_ENVখালি রয়েছে তার সাথেও কাজ করে । কনর ম্যাকডার্মোট্রোয়ের দুর্দান্ত উত্তরটি পড়ুন ।
প্লেকে


যারা, সিম্ফনি কাঠামো ব্যবহার করছেন, তাদের উপরের আরও একটি সীমাবদ্ধ কেস রয়েছে। getenv () সর্বদা env ভেরিয়েবলের মান ফিরিয়ে দেবে যেমনটি পিএইচপি সার্ভার শুরু হওয়ার পরে, যদিও পরে এটি পরিবর্তন করা হয়েছিল। যখন en _ENV [] .env ফাইলগুলি সংশোধন করে রানটাইমে পরিবর্তন করা যায়। তবে অবশ্যই এটি সিমফোনির সাথে সম্পর্কিত, এবং সাধারণভাবে পিএইচপি নয়।
রস ইভন্তেসিভ

উত্তর:


60

জেন্তেভ সম্পর্কে পিএইচপি ডকুমেন্টেশন অনুসারে , তারা হুবহু একই, ব্যাতিক্রমটিgetenv ক্ষেত্রে-সংবেদনশীল উপায়ে পরিবর্তনশীলটির সন্ধান করবে। বেশিরভাগ সময় এটি সম্ভবত কিছু যায় আসে না, তবে ডকুমেন্টেশনের একটি মন্তব্য ব্যাখ্যা করে:

উদাহরণস্বরূপ উইন্ডোজ $ _SERVER ['পাথ'] তে আপনি যেমনটি দেখেন, তেমনই প্রথম অক্ষরকে মূলধন দিয়েছিলেন, 'পাথ' নয় যেমনটি আপনি আশা করতে পারেন।

সে কারণে, আপনি সম্ভবত getenvপরিবর্তন করতে চাইছেন এমন ভেরিয়েবলের শিরোনামের আবরণ সম্পর্কে নিশ্চিত না হলে আমি সম্ভবত ব্যবহার করতে চাইব ।


15
$ _ENV ("FOO") এবং গেটেনভ ("FOO") বিভিন্ন ফলাফল কেন দেয় তা ব্যাখ্যা করে না।
সমৃদ্ধ পুনরায়

যুক্ত getenv()সুবিধা: আপনার অ্যাক্সেসের আগে isset/ চেক emptyকরার প্রয়োজন নেই। getenv()নোটিশ ছাড়বে না
স্টিভ ক্লে

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ফাংশন, এই হল কারণ তিনটি উপায়ে যে পিএইচপি এনভায়রনমেন্ট ভেরিয়েবল আনা পারেন:

  1. মাধ্যমে sapi_getenv(যেমন যদি এটি অ্যাপাচি থেকে পরিবেশের পরিবর্তনশীল হয়ে থাকে)
  2. উইন্ডোজ থেকে, থেকে GetEnvironmentVariableA
  3. যদি নন-উইন্ডোজ getenvথাকে তবে প্রদত্ত ফাংশন থেকে libc

যতদূর আমি বলতে পারি, একমাত্র সময় যখন এটি কেস-সংবেদনশীল পদ্ধতিতে আচরণ করবে উইন্ডোজে কারণ উইন্ডোজ এনভায়রনমেন্ট ভেরিয়েবল এপিআই আচরণ করে। আপনি যদি লিনাক্স, বিএসডি, ম্যাক ইত্যাদিতে থাকেন তবে getenvএখনও কেস সংবেদনশীল।

মারিও দ্বারা উল্লিখিত হিসাবে , $_ENVবিভিন্ন কনফিগারেশনের কারণে সর্বদা পপুলেটেড হয় না variables_orderতাই আপনি $_ENVযদি সার্ভার কনফিগারেশন নিয়ন্ত্রণ না করেন তবে এড়ানো ভাল best

সুতরাং, সর্বাধিক বহনযোগ্য পিএইচপি কোডের জন্য:

  1. ব্যবহার getenv
  2. পরিবেশের পরিবর্তনশীল নামের জন্য সঠিক ক্ষেত্রেটি ব্যবহার করুন।

39

উপরন্তু $_ENVসাধারণত খালি যদি variables_orderdoes't আছে Eতালিকাভুক্ত। অনেকগুলি সেটআপগুলিতে সম্ভবত এটি সম্ভবত $_SERVERজনবহুল এবং $_ENVসিএলআই ব্যবহারের জন্য কঠোর is

অন্যদিকে getenv()সরাসরি পরিবেশে প্রবেশ করে।

(কেস-স্পষ্টতা সম্পর্কে, একজন আরও সহজভাবে নিয়োগ করতে পারে array_change_key_case()))


6

আমি দেখেছি getenv()একটি এড়াতে দরকারী অদ্ভুত পিএইচপি বাগ যেখানে মাঝে মাঝে $_SERVERএবং $_ENVযদি অনির্দিষ্ট ছিল auto_globals_jit(তৈরি সক্ষম করা ছিল _SERVER এবং _ENV যখন তারা প্রথম ব্যবহার করছি ভেরিয়েবল)। সেই থেকে আমি এটি ব্যবহার শুরু করি।


3

পিএইচপি ডক্স থেকে নেওয়া :

এই ফাংশনটি দরকারী (তুলনায় $_SERVER, $_ENV) কারণ এটি ar অ্যারে কেস-সংবেদনশীল উপায়ে name বর্ণের কীটি অনুসন্ধান করে। উইন্ডোজ উদাহরণস্বরূপ $_SERVER['Path']আপনি ক্যাপিটালাইজড দেখতে চান, ' PATH' হিসাবে আপনি প্রত্যাশা ছিল না। সুতরাং ঠিক:<?php getenv('path') ?>


3

আমি যুক্ত করব যে জেন্তেভ () আরও ভাল পছন্দ কারণ একটি কার্য হিসাবে এটি পরীক্ষার উদ্দেশ্যে ওভারলোড করা যেতে পারে। অন্যদিকে আপনার _S _SERVER বা $ _ENV ভেরিয়েবলগুলি ওভাররাইট করা টেস্ট ফ্রেমওয়ার্ক এবং অন্যান্য গ্রন্থাগারগুলিতে হস্তক্ষেপ করতে পারে এবং শেষ পর্যন্ত নিরাপদে চালিয়ে যেতে আরও অনেক বেশি কাজ প্রয়োজন।


-1

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);
    }
}
?>

এর আসল প্রশ্নের সাথে কী সম্পর্ক আছে?
সাইক্লোনকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.