Development Tip

getenv () 대 PHP에서 $ _ENV

yourdevel 2020. 10. 26. 21:26
반응형

getenv () 대 PHP에서 $ _ENV


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

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

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


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

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

따라서 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

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

  1. Via sapi_getenv(예 : Apache에서 환경 변수를 가져 오는 경우)
  2. Windows의 경우 GetEnvironmentVariableA.
  3. 비 Windows에서에서 만약 getenv에 의해 제공되는 기능 libc.

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

mario 에서 언급했듯이의 $_ENV구성이 다르기 때문에 항상 채워지는 것은 아니므로 서버 구성을 제어하지 않는 경우 variables_order피하는 것이 가장 좋습니다 $_ENV.

따라서 가장 이식성이 뛰어난 PHP 코드의 경우 :

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

또한 $_ENV경우 일반적으로 비어 variables_orderdoes't가있다 E나열. 많은 설정에서 만 $_SERVER채워질 가능성이 높으며 $_ENVCLI 사용을위한 것입니다.

반면에 getenv()환경에 직접 액세스합니다.

(대소 문자의 모호성에 관해서는 array_change_key_case().)


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


PHP 문서 에서 발췌 :

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


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

참고 URL : https://stackoverflow.com/questions/8798294/getenv-vs-env-in-php

반응형