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.phpinclude했고, /var/www/children/config.php에서 __DIR__을 찍어 보면 /var/www/children이 리턴될 것이다.

마법 상수 __DIR__은 PHP 5.3부터 추가된 것이다. 5.2를 사용해야 하는 경우에는 매뉴얼의 설명대로 dirname(__FILE__)을 사용하면 된다.

  1. 변수(variable)는 변할 수 있는 값, 상수(constant)는 한 번 정의하면 변하지 않는 값. PHP에서 변수는 $로 시작하고 =으로 값을 할당한다. 상수는 $없이 이름을 시작하고 define()으로 값을 할당한다. 유효한 상수명은 문자나 밑줄로 시작하고 다른 문자나 숫자, 밑줄이 뒤를 따른다. 

  2. 따로 지정해 주지 않아도 정의되며 어떤 스크립트에서도 사용 가능한 상수.