하나의 서버에서 같이 운영하고 있는 사이트별로 PHP 옵션을 다르게 적용해야 하는 경우가있습니다.
예를 들어, 동일 서버를 블로그 및 웹 개발 용도로 함께 사용한다면, php.ini의 Error-handling 관련 옵션을 서로 다르게 적용해야 합니다.
즉, 개발용 디렉토리에서는 PHP관련 모든 오류메시지가 표시되게 하는 반면, 블로그 디렉토리에서는 보안상 오류 메시지를 출력하지 않도록 설정해야 합니다.
별도의 php.ini를 만들어서 디렉토리별로 서로 다른 환경설정 파일을 적용하면 좋겠지만, 아쉽게도 이렇게 하기 위해서는 정식판 PHP가 아닌 suPHP과 같은 다른 PHP 패키지를 사용해야 합니다.
단, PHPINIDir이라는 지시자를 활용하여 가상 호스트(Virtual Host)별로 php.ini 파일을 다르게 적용할 수 있습니다. 다음과 같이 작성하고 서버를 재시작하면 해당 가상 호스트는 /etc/php/my_config/php.ini 파일의 설정대로 동작합니다.
<VirtualHost xxx.xxx.xxx.xxx:80> ... PHPINIDir /etc/php/my_config ... </VirtualHost>
하지만, 이 방법의 경우 하나의 IP와 HTTP 포트를 이용하여 서버를 운영하는 경우 사용할 수 없다는 문제가 있습니다. (PHPINIDir 옵션은 Directory 지시자 안에 들어갈 수 없습니다.)
Apache에서 httpd.conf의 <Directory> 구문과 각 디렉토리의 .htaccess 파일을 이용하여 디렉토리별로 옵션을 다르게 설정할 수 있듯이, PHP의 환경설정 내용도 디렉토리별로 다르게 지정할 수 있습니다.
핵심은, php_value와 php_flag 지시자를 활용하는 것입니다.
/var/www/develop 디렉토리의 PHP Error-handling 옵션을 변경하는 경우를 예로 들어 설명하도록 하겠습니다.
방법1: Directory 지시자를 활용한 설정
/etc/apache2/sites-available 디렉토리에 있는 사이트 설정파일 내에 디렉토리별로 옵션을 지정할 수 있습니다. 이 설정은 <Directory> 지시자 안에 입력합니다.
사이트 설정 파일 내에 다음과 같이 입력하고 서버를 재시작하면 /var/www/develop 디렉토리에서는 Error-Report 기능이 활성화됩니다.
... <Directory /var/www/develop /> ... php_value error_reporting 32767 php_flag display_errors on php_flag display_startup_errors on php_flag track_errors on php_flag html_errors on ... </Directory> ...
여기에 입력하는 형식은 다음과 같습니다.
php_value [환경변수명] [설정값] php_flag [환경변수명] [on|off]
주의사항이 있는데, php_value와 php_flag를 잘 구분해서 사용해야 한다는 점입니다.
php_flag는 on/off와 같이 Boolean값을 갖는 환경변수명을 처리하며, php_value는 숫자와 문자와 같은 값을 처리합니다.
php_value의 경우, php.ini에 등장하는 SYMBOL을 지정해서는 안 됩니다.
php.ini에서는 error_reporting 환경변수는 편의상 E_ALL이나 E_NOTICE와 같은 SYMBOL을 사용할 수 있는데, 이러한 SYMBOL들은 고유한 숫자값과 대응됩니다.
<Directory> 지시자 안에서는 반드시 이 SYMBOL들을 대응하는 숫자값으로 바꿔서 입력을 해 줘야 합니다. 위 예시에 나온 32767 숫자는 E_ALL|E_STRICT를 의미합니다.
각 SYMBOL이 의미하는 숫자를 잘 모를때는 구글링을 해도 되지만, 다음과 같이 간단히 php 파일을 만들어서 알아볼 수 있습니다.
<? echo(E_ALL|E_STRICT); ?>
이렇게 쓰고 브라우저에서 열어보면 32767이라는 숫자가 나타날 것입니다.
방법2: .htaccess 를 활용하는 방법
/var/www/develop/.htaccess 파일에 다음 구문을 삽입하여 옵션을 지정할 수도 있습니다. 단, <Directory> 지시자 내에서 AllowOverride 가 가능하도록 설정(All)되어 있어야 합니다.
... php_value error_reporting 32767 php_flag display_errors on php_flag display_startup_errors on php_flag track_errors on php_flag html_errors on ...