Server & OS

PHP 확장모듈 추가방법

컨텐츠 정보

본문

[PHP 확장모듈을 추가하는 방법]

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

*주)
이 문서에 대한 최신 내용은 아래 URL에서 확인할 수 있습니다.

http://www.linuxchannel.net/docs/php-ext.txt

---------------------------------------------------------
목차
1. PHP 확장 모듈과 추가하는 방법에 대해서
2. 확장 모듈 만들기
  2-1. 기본 모듈의 컴파일 방식
  2-2. phpize 를 이용한 컴파일 방식
3. 확장 모듈 로딩하기
  3-1. root 권한일 경우
  3-2. account 권한일 경우
---------------------------------------------------------


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 버전은 --with-mbstring=kr,shared
이와 같이 하면 됩니다.(실제로 4.3은 직접 해보질않아서)


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로 코딩하는
방법을 말합니다.

이에 대한 자세한 내용은,

  - http://phpschool.com/classroom/phpext/phpext_1.html

앞의 URL을 방문하기 바랍니다.

*예: 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 ; <-- 추가
...
----------------------------

이렇게 수정했으면 mbstring.so 모듈을

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

으로 복사해야 합니다.

그리고 아파치를 재가동하고 phpinfo() 등으로
확인해 보세요.


3-2. account 권한일 경우

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

우선 php.ini 설정이 어떻게 되어 있는지 다음과 같이
확인해 봅니다.

PHP 4.2.0 이상이면 ini_get_all() 로도 가능

<?php
echo 'enable_dl : ' . ini_get('enable_dl') .'<BR>';
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 파일이 그 기준입니다.
(상당히 골치아픈 설정 T.T)

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

따라서 여러 시스템에서 호환성을 고려한다면
extension_dir 의 값을 / 로 거슬러 올라가 / 를 기준으로
mbstring.so 파일이 있는 경로를 지정해주는 것이 좋습니다.

*예)
<?php
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 를 사용해 보기 바랍니다.

  http://ftp.linuxchannel.net/devel/php_dl/


EOF

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
세상에서 가장 현명한 사람은 모든 사람으로부터 배울 수 있는 사람이요, 가장 사랑받는 사람은 모든 사람을 칭찬하는 사람이요, 가장 강한 사람은 자신의 감정을 조절할 줄 아는 사람이다. (탈무드)