
[PHP] $_SERVER란 무엇이고 어떻게 사용해야 할까?
2018-01-23에 내용을 대폭 수정했다.
$_SERVER
변수 정의와 설명
$_SERVER
는 PHP에서 사용하는 여러 환경값이 들어가 있는 배열이다. PHP $_SERVER
매뉴얼에는 “서버와 실행 환경 정보”라고 정의돼 있다.
이 변수에는 헤더, 패스, 스크립트 위치 같은 정보가 배열로 담겨 있다. 이 배열은 웹 서버가 만든다. 모든 웹서버가 이 값들을 설정하는 것은 아니다. 어떤 서버는 몇가지를 누락할 수도 있다. 즉, 아파치 웹 서버가 설정해 주는 값을 다른 모든 웹서버가 설정해 줄 것이라고 기대해선 안 된다는 뜻이다. 많은 경우 CGI/1.1 명세에 있는 값이므로 명세를 기준으로 값을 기대하는 편이 좋을 것이다.(PHP $_SERVER
매뉴얼 참고)
웹서버만이 이 값을 지정하는 것은 아닌데, 실제로 php -a
로 php 인터랙티브 쉘(REPL - Read–Eval–Print Loop)로 들어가서 print_r($_SERVER)
를 실행해 보면 웹서버와는 또 다른 값들이 설정돼 있는 것을 볼 수 있다.
내용을 보는 방법
$_SERVER
의 내용을 볼 때는 print_r
이나 var_dump
를 사용하면 된다. var_dump
는 값의 타입과 길이 정보까지 알려주므로 좀 장황하다. 나는 그래서 print_r
로 보는 걸 선호한다. 그냥 아래 코드로 보면 된다.
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
굳이 <pre>
를 붙이지 않고 출력한 뒤 html 소스 보기를 해서 봐도 된다. 터미널에서 출력할 때 필요 없는 건 두말할 나위가 없고 말이다.
주의사항
다른 방법으로 얻을 수 있는 값을 $_SERVER
에 의존하지 않는 편이 좋다. 프로그램을 터미널에서 돌리는 경우도 염두에 둬야 하는데, 터미널에서 돌릴 경우 $_SERVER
에 없는 값이 많다. PHP는 웹서버 위에서만 돌아가는 언어가 아니다.
예컨대, $_SERVER['DOCUMENT_ROOT']
는 사용하지 말자. 필요한 경우에는 환경설정에서 상수1를 이용해 define('ROOT', '/var/www/myWebRoot')
식으로 설정하는 편이 낫다. 환경설정 파일을 만들고 웹서버 루트 경로를 자동으로 잡도록 할 수도 있다.
// 웹서버 루트에서 ROOT 상수를 설정하는 경우
define('ROOT', __DIR__);
echo ROOT;
// config 같은 폴더에서 ROOT 상수를 설정하는 경우
define('ROOT', realpath(__DIR__ . '/..'));
echo ROOT;
이렇게 하면 웹서버에 독립적으로 ROOT
라는 상수를 사용할 수 있다.
__DIR__
이란?
__DIR__
은 PHP의 마법 상수(magic constant)다.2 현재 파일이 있는 디렉토리를 반환한다. 매뉴얼의 설명을 인용하면 아래와 같다.
__DIR__
: 파일의 디렉토리. 포함한 파일 안에서는, 포함된 파일의 디렉토리를 반환합니다. 이는dirname(__FILE__)
과 동일합니다. 디렉토리명은 루트 디렉토리가 아닌 이상, 마지막에 슬래시가 없습니다.
포함한 파일이란 include
한 파일을 말한다. /var/www/parent.php
에서 /var/www/children/config.php
를 include
했고, /var/www/children/config.php
에서 __DIR__
을 찍어 보면 /var/www/children
이 리턴될 것이다.
마법 상수 __DIR__
은 PHP 5.3부터 추가된 것이다. 5.2를 사용해야 하는 경우에는 매뉴얼의 설명대로 dirname(__FILE__)
을 사용하면 된다.
-
변수(variable)는 변할 수 있는 값, 상수(constant)는 한 번 정의하면 변하지 않는 값. PHP에서 변수는
$
로 시작하고=
으로 값을 할당한다. 상수는$
없이 이름을 시작하고define()
으로 값을 할당한다. 유효한 상수명은 문자나 밑줄로 시작하고 다른 문자나 숫자, 밑줄이 뒤를 따른다. ↩ -
따로 지정해 주지 않아도 정의되며 어떤 스크립트에서도 사용 가능한 상수. ↩