[php] 내 $ _ENV가 비어있는 이유는 무엇입니까?

나는 실행 중이며 Apache/2.2.11 (Win32) PHP/5.3.0.htaccess 파일에서 다음을 수행했습니다.

SetEnv FOO bar

$_ENVPHP 파일에서 변수를 출력 하면 빈 배열이 생깁니다. 내 환경 변수가 표시되지 않는 이유는 무엇입니까? 왜 처음에는 비어 있습니까?

그래도 내 변수를 찾았지만 $_SERVER변수에 나타납니다 . 그리고 어떤 이유로 두 번 나타납니다. 왜 이런거야?

[REDIRECT_FOO] => bar
[FOO] => bar

을 사용하여 얻을 수있는 것처럼 보이 getenv('FOO')므로 대신 사용하는 것이 좋습니다. 그러나 나는 여전히 이것이 원인이 무엇인지 조금 궁금합니다. Windows 문제입니까? 아니면 무슨 일이 일어나고 있습니까?



답변

여기에 두 가지 문제가 있음이 밝혀졌습니다.

1. $_ENVphp.ini가 허용하는 경우에만 채워집니다. 기본적으로는 그렇지 않은 것 같습니다. 적어도 기본 WAMP 서버 설치 에서는 그렇지 않습니다 .

; This directive determines which super global arrays are registered when PHP
; starts up. If the register_globals directive is enabled, it also determines
; what order variables are populated into the global space. G,P,C,E & S are
; abbreviations for the following respective super globals: GET, POST, COOKIE,
; ENV and SERVER. There is a performance penalty paid for the registration of
; these arrays and because ENV is not as commonly used as the others, ENV is
; is not recommended on productions servers. You can still get access to
; the environment variables through getenv() should you need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"

내가 설정 한 경우 variables_order에 다시 EGPCS, $_ENV더 이상 빈 없습니다.

당신이 사용하는 경우 2. SetEnv당신에 .htaccess, 그것에서 끝나는 $_SERVER되지에서$_ENV , 내가 말할 돼있는이 이름을 때 혼란 태드입니다 SetEnv

# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/

# php
var_dump($_SERVER['ENV'], $_SERVER['BASE']);

// string 'dev' (length=3)
// string '/ssl/' (length=5)

3.이 getenv함수는 항상 작동하며 $ _ENV에 대한 PHP 설정의 영향을받지 않습니다. 또한 대소 문자를 구분하지 않는 것처럼 보이므로 유용 할 수 있습니다.

var_dump(getenv('os'), getenv('env'));

// string 'Windows_NT' (length=10)
// string 'dev' (length=3)


답변

$_ENV 변수는 PHP가 실행되는 환경에서 가져 오며, 설정 (OS, 서버, PHP가 Apache 모듈로 실행되는지 FastCGI에서 실행되는지 등)에 따라 크게 다를 수 있습니다.

표준 아파치 +에서 IIRC는 Windows, 변화 변수 수있는 유일한 방법에 설치하는 방법 mod_php $_ENV윈도우 환경 변수를 (참조 변경하는 것입니다 ). 이는 Windows에서 PHP 확장을 다룰 때 중요 할 수 있습니다. 그 중 일부 (예 php_ldap:)는의 환경 변수를 통해서만 구성 할 수 있기 때문 입니다 $_ENV.


답변

REDIRECT_*RewriteRules를 사용하는 경우 변수가 나타납니다. 내 서버에서도 그들은 그렇게 나타납니다. FastCGI에서 실행하는 것과 관련이있을 수 있습니다. 그리고 suexec와 결합하면 전체 환경 변수 풀을 정리할 가능성이 가장 높습니다. PassEnv특히 다시 가져 오기 위해 추가 구성이 필요할 수 있습니다 . getenv ()가 왜 작동하는지에 대해서는 단서가 없습니다. 그러나 모든 현상은 서버 및 PHP 구성에 따라 다릅니다. 서버 오류에 대해 물어보십시오.


답변