PHP 확장 모듈 추가 하기 - PHP

- 작성자 : 김칠봉 <san2(at)linuxchannel.net>
- 작성일 : 2003.03.02
- 분 류  : PHP
- 수 준  : 초급
- 내 용  : PHP 확장모듈 mbstring.so을 추가하는 방법(예제)
- 키워드 : PHP, extension, modules, mbstring.so

1. PHP 확장 모듈과 추가하는 방법에 대해서

PHP 확장 모듈은 제공 형태에 따라서 크게 두가지로 볼 수 있습니다.
  ・PHP 소스의 ext 디렉토리에 존재하는 모듈(기본 확장 모듈)
  ・사용자 직접 만들거나 기타 다른 확장 모듈

전자의 경우는,

####확인 방법####

# cd php-xxx/ext 
#ls 
aspell 
... dio ... 
mbstring ################
이와 같이 확인할 수 있습니다. (90개가 넘는 확장 모듈이 있음) 후자는 php-xxx/ext/ext_skel 를 이용하여 사용자가 직접 만든 확장모듈을 의미합니다. oops.org 에서 배포한 korean.so 확장 모듈이 이에 해당됩니다.

우선 웹서버가 이런 PHP 확장 모듈(예: mbstring.so)를 로딩해야 하는데 로딩하는 방법은 크게 두가지 정도가 있습니다.
  ・아파치 코어에 PHP를 정적으로 컴파일하는 방법
  ・shared mbstring.so 모듈을 만드는 방법

전자의 방법은 처음부터 Apache + PHP를 다시 빌드함을 의미하고, 후자의 방법은 PHP 확장모듈을 현재 상태에서 추가하는 방법입니다. 후자의 경우에서 주의할 점이 있는데, 
아파치에서는 mod_so.c 모듈이 정적으로 아파치 core 에 컴파일되어 있어야 합니다.

####확인 방법#### # httpd -l ... mod_so.c ... ################

전자의 방법은 생략하고, 후자의 방법에도 서로 다른 방법이 있습니다. 즉,
  ・첫번째, 기존 모듈의 컴파일 방식
  ・두번째, phpize 를 이용한 컴파일 방식

결과는 동일하지만 두번째 방식은 주로 PHP에서 공식적으로 제공하지 않는 모듈을 추가할때 기존 php.net 에서 제공한 PHP 소스 없이 컴파일 하는 방법 입니다.

mbstring.so 모듈은 PHP에서 제공하기 때문에 첫번째 방식을 사용하면 됩니다.

우선 PHP 확장 모듈을 정적으로 아파치코어에 넣지 않고, PHP의 shard 모듈로 빌드하기 위해서,

--enable-mbstring=shared

이와 같이 'shared'를 붙여줘야 mbstring.so 모듈을 만들수 있습니다. 
PHP 4.3 버전은 이하와 같이 하면 됩니다.(실제로 4.3은 직접 해보질않아서)

--with-mbstring=kr,shared

2. 확장 모듈 만들기

2-1. 기본 모듈의 컴파일 방식

우선 현재 아파치에서 사용하는 PHP 버전을 알아봅니다. (phpinfo(), phpversion() 또는 HTTP 응답헤더에도 나옴)
만약 4.2.1 버전을 사용한다면, php-4.2.1.tar.gz 버전을 받아서 임시 디렉토리에 풉니다.
서로 다른 버전일 경우,
잘 안될 경우가 있으므로 가능한 현재 사용하는 같은 버전으로 하는 것이 좋습니다.

# tar zxvf php-4.2.1.tar.gz
# cd php-4.2.1
# ./configure --enable-mbstring=shared
# cd ext/mbstring
# make

이렇게 컴파일하면 php-4.2.1/ext/mbstring/.libs/mbstring.so or php-4.2.1/modules/mbstring.so 에
파일이 만들어집니다.

2-2. phpize 를 이용한 컴파일 방식

이 방법은 앞서 얘기 했듯이 PHP에서 제공하지 않는 확장 모듈을 컴파일할 때, 즉 기존(php.net에서 제공한)의 PHP 소스가 없을 경우에 사용하는 방법입니다.

대부분 이런 모듈은,

# php-xxx/ext/ext_skel --extname=xxx

이와 같이 기본 layout을 만들고 확장 모듈 xxx를 C로 코딩하는 방법을 말합니다.
이에 대한 자세한 내용은 해당 페이지를 방문하기 바랍니다.

예: xxx 확장모듈)

# ls /usr/local/php/bin (or /usr/bin)
pear  pearize  php  php-config  phpextdist  phpize  phptar
#
# cd xxx
# /usr/local/php/bin/phpize (configure 파일이 만들어짐)
# ./configure \
  --with-php-config=/usr/local/php/bin/php-config \
  --enable-xxx
# make 
# ls module/*.so
xxx.so

3. 확장 모듈 로딩하기

3-1. root 권한일 경우

만들어진 PHP 확장 mbstring.so 모듈을 아파치가 로딩하도록 php.ini 파일을 다음과 같이 수정합니다.

##########[php.ini]##########
...
extension_dir = /usr/local/php/modules
...
extension = dba.so
extension = dio.so
extension = oci8.so
extension = mbstring.so //추가
...
############################

/usr/local/php/modules/mbstring.so

mbstring.so 모듈을 해당 패스에 복사하고 아파치 재실행, phpinfo()등에서 확인해 보세요.

3-2. account 권한일 경우

만약, 
자신이 root 권한이 없는 계정 입장이라면, 만들어지 mbstring.so 모듈을 웹서버에 복사하고 php 파일에 직접 로딩하는 방법도 있습니다.

우선 php.ini 설정이 어떻게 되어 있는지 다음과 같이 확인해 봅니다.
(PHP 4.2.0 이상이면 ini_get_all() 로도 가능)
[php.ini]설정
<?
echo 'enable_dl : ' . ini_get('enable_dl'); 
echo 'extension_dir : ' . ini_get('extension_dir');
?>

만약 'enblae_dl : 1(or On)'이 아니면 dl() 함수를 사용하여 사용자가 직접 확장 모듈을 로딩하지 못하므로 1(or On)으로 설정되어 있어야 합니다.

또한 extension_dir 설정은 사용자가 직접 설정하지 못하는 상수 4의 값을 갖습니다. 즉 이 설정은 php.ini 또는 httpd.conf 파일에서만 설정가능합니다.

따라서 관리자가 설정한 extension_dir 값을 보고 상대경로로 mbstring.so 모듈을 지정하여 해야 합니다.

만약 extension_dir : ./ 로 출력된다면 dl() 함수를 직접 호출 또는 이 함수를 포함하는 PHP 파일이 그 기준입니다. 

즉 모든 웹서버의 extension_dir 설정값이 모두 다르므로 반드시 확인해서 상대경로로 지정해야 합니다.

따라서 여러 시스템에서 호환성을 고려한다면 extension_dir 의 값을 / 로 거슬러 올라가 / 를 기준으로
mbstring.so 파일이 있는 경로를 지정해주는 것이 좋습니다.
php class
<?
function get_extdir()
{
  $dir[e] = ini_get('extension_dir');
  $dir[u] = dirname($_SERVER[PATH_TRANSLATED]).'/'; // script file directory
  $dir[ut] = preg_replace(';[^/]+;','..',$dir[u]);

  if(preg_match(';^/;',$dir[e])) {
    $dir[e] = preg_replace(';[^/]+;','..',$dir[e]);
  }
  else $dir[e] = '';

  return $dir; // array
}

function ext_load($dir, $mod)
{ 
  if(preg_match(';^/;',$mod)) {
    if(!$dir[e]) $file = $dir[ut] . $mod;
    else $file = $dir[e] . $mod;
  } else {
    if(!$dir[e]) $file = $mod;
    else $file = $dir[e] . $dir[u] . $mod;
  }

  if(is_file($file)) {
    $ext = str_replace('.so','',basename($file));
    if(!extension_loaded($ext)) @dl($file);
  }

  if(!extension_loaded($ext)) {
    echo $file.' is not loaded';
  }
}

// example
$extdir = get_extdir();
ext_load($extdir, '/any/path/to/mbstring.so');
phpinfo();
?>
좀더 자세한 디버깅과 여러 모듈을 한꺼번에 로딩하기를 원한다면 아래의 필자의 허접한 php class를 사용해 보기 바랍니다.

Share
이 글과 관련된 글
  1. [2010/06/28] 접속한 사용자 IP 구하기 by HMR (218)
  2. [2010/06/10] [PHP] 날짜간 차이 구하기 by 눈물꽃 (380)
  3. [2009/06/09] 불가리아어 апаш - 소매치기 (명사) by 파견카나 (88)
  4. [2010/04/16] JDK 취약점 패치 by hoostory (145)
  5. [2006/12/03] PHP에서 Excel로 저장하기 by 유동주 (342)
TAG

Leave Comments



T-NAVI