getenv () 대 PHP에서 $ _ENV


88

getenv()과 의 차이점은 무엇입니까 $_ENV?

둘 중 하나를 사용하는 것 사이의 장단점이 있습니까?

나는 때때로 getenv()내게 필요한 것을 제공하지만 $_ENV그렇지 않은 경우 (예 :)를 발견했습니다 HOME.


1
피투성이의 세부 사항을 숨기는 PHP에 갇히지 마십시오. $_ENV그리고 $_SERVER다양한 방법으로 얻은 데이터로 채워집니다. getenv()PHP가 직접 액세스 할 수없는 데이터에 액세스하는 또 다른 방법입니다. variables_order = "G", 때 $_SERVER$_ENV비어있는 경우 에도 작동합니다 . Conor McDermottroe 의 훌륭한 답변을 읽어보십시오 .
Palec


Symfony 프레임 워크를 사용하는 사람들에게는 위의 제한된 경우가 하나 더 있습니다. getenv ()는 나중에 변경된 경우에도 PHP 서버가 시작되었을 때의 env 변수 값을 항상 반환합니다. $ _ENV []는 .env 파일을 수정하여 런타임에서 변경할 수 있습니다. 그러나 물론 일반적인 PHP가 아닌 Symfony와 관련이 있습니다.
로스 Ivantsiv

답변:


59

getenv대한 PHP 문서에 따르면 getenv대소 문자를 구분하지 않는 방식으로 변수를 찾는 것을 제외하고는 정확히 동일 합니다. 대부분의 경우 문제가되지는 않지만 문서의 주석 중 하나는 다음과 같이 설명합니다.

예를 들어 Windows에서 $ _SERVER [ 'Path']는 예상대로 'PATH'가 아니라 첫 글자가 대문자로 표시되는 것과 같습니다.

따라서 getenv검색하려는 변수 제목의 대 / 소문자가 확실하지 않으면 사용하기로 선택했을 것입니다 .


14
$ _ENV ( "FOO") 및 getenv ( "FOO")가 다른 결과를 반환하는 이유를 설명하지 않습니다.
rich remer

추가 된 getenv()이점 : 액세스하기 전에 확인 isset/ 확인할 필요가 없습니다 empty. getenv()통지를 발행하지 않습니다.
Steve Clay

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

보면 소스 코드 에 대한 getenvPHP 환경 변수를 가져올 수있는 세 가지 방법이 있기 때문에 기능이 있습니다 :

  1. Via sapi_getenv(예 : Apache에서 환경 변수를 가져 오는 경우)
  2. Windows의 경우 GetEnvironmentVariableA.
  3. Windows가 아닌 경우에서 getenv제공 하는 함수 에서 libc.

내가 말할 수있는 한, 대소 문자를 구분하지 않는 방식으로 작동하는 유일한 시간은 Windows 환경 변수 API가 작동하는 방식이기 때문에 Windows에서만 작동합니다. Linux, BSD, Mac 등을 사용하는 getenv경우 여전히 대소 문자를 구분합니다.

에서 언급 한 바와 같이 마리오 , $_ENV때문에 항상 다른 구성으로 채워지지 않습니다 variables_order당신이 피 경우 가장 그래서 $_ENV서버 구성을 제어하지 않는 경우.

따라서 가장 이식성이 높은 PHP 코드의 경우 :

  1. 사용 getenv.
  2. 환경 변수 이름에 올바른 대소 문자를 사용하십시오.


6

내가 발견 getenv()것을 방지하는 데 유용 이상한 PHP 버그 곳 때때로을 $_SERVER하고 $_ENV있는 경우 정의되지 않은 한 auto_globals_jit활성화되었다합니다 (생성 _SERVER_ENV의 그들이 먼저 사용 할 때 변수). 그 이후로 나는 그것을 사용하기 시작했습니다.


3

PHP 문서 에서 발췌 :

이 함수 (비교 유용한 $_SERVER, $_ENV그것은 그 배열 대소 문자 구별하게 $ varname에 키를 검색하기 때문에). 예를 들어 Windows $_SERVER['Path']에서는 PATH예상대로 ' '가 아니라 대문자로 표시되는 것과 같습니다 . 그래서 그냥:<?php getenv('path') ?>


3

함수로서 테스트 목적으로 오버로드 될 수 있기 때문에 getenv ()가 더 나은 선택이라고 덧붙였습니다. $ _SERVER 또는 $ _ENV 변수를 덮어 쓰면 테스트 프레임 워크 및 기타 라이브러리를 방해 할 수 있으며 궁극적으로 안전하게 수행하려면 더 많은 작업이 필요합니다.


0

환경을 읽고 만들기

<?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.