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


81

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

SetEnv FOO bar

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

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

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

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


2
Windows 문제가 아니라 Linux (PHP를 모듈로 실행)에서도 동일합니다. 세부 사항에 대해서는 잘 모르겠지만 웹 서버의 환경이 PHP의 환경과 동일하지 않을 수 있으므로 $_SERVERvar 로 전송됩니다 . 나는 getenv()내가 수집하는 한 대소 문자를 구분하지 않고 모두 검색하는 사용에 대한 투표를 할 것 입니다.
Wrikken

1
보조 노트에서 : CLI 인스턴스는 않습니다 그것을 얻을 $_ENV.
Wrikken

@svish 귀하의 업데이트가 저를 도왔습니다. 답변으로 변경했다면 기꺼이 찬성하겠습니다.
Dominic Sayers 2013 년

@svish 질문에 게시 된 솔루션은 실제로 아래 답변으로 게시되어야합니다. 이 질문은 중복 가까운 대상으로 여러 번 연결되었지만,이 솔루션은 :)이 문제의 장소까지 벗어
마이클 Berkowski

@MichaelBerkowski 메모 감사합니다. 좋은 생각. 지금하고 있습니다 :)
Svish

답변:


121

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

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)

6
AGGH! 정말 고맙습니다!!! 당신은 내가 mod_env 또는 무언가에 문제가 있다고 생각하면서 얼마나 오랫동안 인터넷 검색을 해왔는지 모릅니다. 나는 variables_order를 완전히 잊었습니다! 굉장 해주셔서 감사합니다 !!!
Marcel

1
값은 이제 따옴표없이 설정해야하는 것 같습니다. (오류 PHP: syntax error, unexpected '"' in php.ini)
yanot

1
감사합니다! 제가 세 번 찬성 할 수 있도록이 질문을 세 개의 답변으로 나눌 수 있나요? : D
더그 매 클린

12

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

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


1

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


아하. 재 작성 모듈이 그것과 관련이있을 것이라고 생각했습니다. 왜 그랬는지 상상할 수 없습니다. 그러나 나는 아파치가 그 이유를 가지고 있다고 확신한다 : p (또는 버그)
Svish

2
getenv일 했는지에 대해 잠을 잃은 경우 : 방금 검색 $_ENV $_SERVER : p
Svish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.