[PHP] PHP 확장 모듈 추가 설치
로빈아빠
본문
최근 들어 mbstring 또는 iconv 등의 확장모듈을 많이 이용하고 있는거 같습니다.
그래서 그런지 확장모듈에 관련된 질문이 많이 올라오더군요.
어떻게 설치를 해야 하는지.. 등등..
매번 답하기도 귀찮고 ... 그냥 어디 참조하라고 하려니... 스쿨에 없네요.
그래서 올려봅니다. 있는데 제가 못찾은거라면 지적해주시면 자삭하겠습니다.
확장모듈 설치
확장 모듈이란 PHP자체에서 지원하는 기능외의 타 프로그램 라이버러리를 이용하여
함수로써 사용하는것들을 말합니다.
gd mbstring iconv curl 외에도 db 연결하는 함수들등 수없이 많은 기능들이 확장 모듈로
제공됩니다. 그런데 이런 프로그램을 사용하기위해 처음부터 PHP설치시 같이 설치하면
좋긴한데 그러지 못한 경우가 많습니다.
대표적인 예가 mbstring 이나 iconv 같은 함수죠..
utf-8 을 euc-kr 로변경하던지 아니면 그반대의 경우도..
여하튼 이런 mb계열 함수나 iconv 함수를 사용하기위해 서비스를 하고 있는
서버의 PHP를 재설치하기엔 곤란한 경우가 많습니다.
그런경우 확장 모듈로 등록해두고 사용하면 따로 PHP를 재설치 하지 않으셔도 됩니다.
설치 방법이야 여러가지가 있겠지만
가장 보편적으로 사용할수 있는 한가지 방법을 적겠습니다.
아참 제가 적는것은 소스설치에 한정된것입니다.
그리고 php는 /usr/local/php에 설치되었다고 가정하에
1. 같은 버젼의 php 소스 다운로드 또는 원소스가 있다면 소스디렉토리로 이동
2. 압축 풀고 cd PHP소스디렉토리/ext/설치하고자하는확장모듈명
3. /usr/local/php/bin/phpize
4. ./configure --with-php-config=/usr/local/php/bin/php-config --enable-설치하고자하는확장모듈명
5. make => modules/설치하고자하는확장모듈명.so 라는 화일이 생성됨
6. 설치하고자하는확장모듈명.so 이 화일을 php.ini 화일의 extension_dir=확장모듈 경로 에
옮겨줌
7. php.ini 에 extension=설치하고자하는확장모듈명.so 추가
8. 아파치 재시작
대부분의 경우는 이와 똑같이 설치하셔도 문제가 없을겁니다.
물론 이게 정확한것은 아닙니다.
PHP에서 공식지원하지 않거나 또는 버젼이 맞지 않는 확장모듈이 있을수 있습니다.
그런 경우에는 위의 과정과는 조금은 다릅니다.
링크 #1 http://phpschool.com/classroom/phpext/phpext_1.html
링크 #2 http://www.linuxchannel.net/docs/php-ext.txt
PHP Version : 4.3.7
Extended Module : vpopmail-0.2.tar.gz ( http://pecl.php.net/package/vpopmail )
전제 : 시스템에 Qmail+Vpopmail 이 정상작동하고 있어야 합니다.
vpopmail 함수 : http://kr.php.net/manual/en/ref.vpopmail.php
PHP에서 vpopmail 함수를 사용하기 위해서는 PECL 에서 제공하는 확장모듈을 설치해줘야 한다.
작업 디렉토리는 /usr/local/src 이다.
소스디렉토리
/usr/local/src/php-4.3.7
/usr/local/src/vpopmail-0.2
vpopmail.tar.gz 을 풀면 package.xml 이 디렉토리 밖에 생성된다. 이 파일을 압축이 풀린 vpopmail-0.2 디렉토리에
같이 넣어준다. ( 식별을 편하게 하기 위해서.. )
1. PHP 소스 디렉토리안에 ext 디렉토리로 이동한다. 이곳에 ext_skel 파일이 있다.
2. ext_skel 을 이용하여 vpopmail 확장 모듈을 설치한다.
# cd /usr/local/src/php-4.3.7/ext
# ./ext_skel --ext-name=vpopmail --xml=/usr/local/src/vpopmail-0.2/package.xml
3. 설치를 하면 ext 디렉토리에 vpopmail 디렉토리가 생성된다.
4. 상위( /usr/local/src/php-4.3.7 ) 디렉토리로 이동한다.
# cd ../
# ./buildconf --force
5. configuration 을 리빌드 하였다. 아래 명령어를 실행하여 확장모듈 옵션이 정상 빌드되는지 확인한다.
# ./configure --with-vpopmail --enable-vpopmail
# make
6. 위 과정이 정상적으로 끝나면 정식 컴파일을 한다.
# make clean
# < 본인이 컴파일할 옵션을 추가해서 컴파일한다. --with-vpopmail 과 --enable-vpopmail 을 같이 넣는다. )
# make
# ls -la ext/vpopmail
< vpopmail.lo 와 링크파일 vpopmail.o 가 생성되었는지 확인한다. >
# make install
7. PHP 설치를 끝낸 후 phpinfo() 페이지에 vpopmail 모듈이 올라와 있는지 확인한다.
8. vpopmail 함수를 사용하기 위해서는 ext/vpopmail/vpopmail.php 파일을 참고한다.
이상이 vpopmail 확장모듈을 설치하는 방법이었습니다.
[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/
[여담]
안녕하세요. 박준철입니다.
PHP에서 C확장 모듈을 만드는 법에 대한 정리를 몇달간 미뤄오다가 제 홈페이지(http://www.exman.pe.kr) 게시판에 소스코드를 HTML로 변환하여 출력하는 기능이 필요하였습니다.
해서 이참에 정리해 보았습니다.
물론 PHP소스 코드를 HTML로 변환하는 것이라면 php에서 기본으로 제공하는 highlight_string 이라는 훌륭한 함수를 쓰면 됩니다.
제가 필요했던 기능은 다른 프로그램언어(주로 Python)의 소스코드를 미려한 HTML로 변환하는 기능이었습니다.
손안데고 코푸는 격으로 다른 사람이 만든게 없나 찾던중에 PHP로 작성된 모듈을 발견하였는데, 그 모듈의 수행 속도가 너무 느리고, 한글문제도 있어 C로 작성된 다른 프로그램을 찾게 되었습니다.
갑작스럽게 찾은 몇가지 라이브러리중 가장 쓰기 쉽고 빠른 수행속도를 보이는 ibformat(http://daveb.net/format/ ) 를 찾게 되었습니다.
Linux환경에서 libformat을 컴파일한 후 얻은 libformat.so를 이용하여 PHP확장 모듈을 만드것을 소개해 드리겠습니다.
첨부된 예제 파일은 php 소스코드의 ext 디렉토리 아래에 풀어서 컴파일이 가능합니다.
예제의 컴파일 방법은 php를 컴파일 할때 일단 한번 ./buildconf 를 실행 한 후 ./configure에 --with-libformat 옵션을 추가하면 됩니다.
php-4.1.2에서 만들었는데 테스트 결과 4.3.0에서도 문제없이 잘 돌아갑니다.
이 글이 완벽하지 않기 때문에 가급적 예제파일을 실행해보고 마는것 보다 이 글을 따라 직접 만들어 보고 문제점이 발생하였을때 스스로 해결해 나아가는 것이 학습에 큰 도움이 되리라 믿습니다.
글을 신속하게 작성하기 위해 경어는 삼가하였으니 이점 헤아려 주시면 감사하겠습니다. ^^
첨부: libformat.tar.gz
확장 모듈이란 PHP문법을 이용하여 만들수 없는 함수나 오브젝트를 C/C++로 직접 작성하는 것이다.
대표적으로 많이 쓰는 확장모듈은 mysql 관련 함수들이다.
PHP를 처음 배울때에 가장 많이 쓰는 예제중 하나가 mysql 연동 예제이다.
mysql_connect, mysql_query 등은 mysql이 C프로그래머를 위해 제공하는 libmysqlclient 라이브러리를 사용하는 확장모듈이다.
이러한 함수들은 PHP문법을 이용하여 직접만들기가 까다롭거나 불가능하다.
PHP로 만들수 없는 기능이나, C로 구현된 라이브러리가 존재하지만 PHP를 이용하여 급하게 사용해야할 경우, 우리는 C확장모듈을 만들어야 하는 상황에 봉착한다.
그럼 시작해보자.
먼저 http://daveb.net/format/ 에서 libformat-1.5.tar.gz을 받아 컴파일하여 설치하자.
tar -zxvf libformat-1.5.tar.gz
cd libformat-1.5
./configure --prefix=/usr
make
make install
참고 - 소스를 아름다운 HTML로 libformat-1.5
이 작업이 완료되면 아래와 같은 라이브러리들이 만들어진다.
확장자 a는 static library이고, so는 shared object 즉 dll이라고 생각하면 된다.
so.2, so.2.3.0 등은 버전 호환을 위해서 사용하는 soname이다. 그다지 중요하지 않으니까 그냥 넘어가자.
[root@joon ext]# ls /usr/lib/libformat*
/usr/lib/libformat.a /usr/lib/libformat.so /usr/lib/libformat.so.2.3.0
/usr/lib/libformat.la /usr/lib/libformat.so.2
이제 libformat 을 사용하는 PHP확장모듈을 만들어 보자.
내가 사용한 PHP버전은 4.1.2이다. 이것은 4.1의 마지막 버전이며 내가 생각하기에 가장 안정적으로 돌아가는 버전중에 하나이다.
PHP소스를 풀고 ext 디렉토리에 들어가자
[root@joon php-4.1.2]# cd ext/
[root@joon ext]# ls
Makefile cyrus ftp mailparse oci8 recode wddx
Makefile.in db gd mbstring odbc satellite xml
aspell dba gettext mcal openssl session xmlrpc
bcmath dbase gmp mcrypt oracle shmop xslt
bz2 dbplus hyperwave medialand ovrimos skeleton yaz
calendar dbx icap mhash pcntl snmp yp
ccvs domxml iconv ming pcre sockets zip
com dotnet imap mnogosearch pdf standard zlib
cpdf exif informix msql pfpro swf
crack ext_skel ingres_ii mssql pgsql sybase
ctype fbsql interbase muscat posix sybase_ct
curl fdf ircg mysql pspell sysvsem
cybercash filepro java ncurses qtdom sysvshm
cybermut fribidi ldap notes readline vpopmail
여기 보이는 디렉토리들이 모두 확장모듈들이다. 이중 qtdom과 dotnet을 제외한 모든 모듈들은 C로 작성되었다.
qtdom과 dotnet은 C++을 사용한 보기드문 모듈인데, 만약 C++라이브러리를 이용하여 확장모듈을 만들 경우 참고할수 있다.
C++로 PHP확장 모듈로 만드는것에 대한 내용은 다음에 정리하겠다.
ext 디렉토리에는 ext_skel이라는 쉘스크립트가 있는데, 이것은 최초에 확장모듈을 만들기 위한 뼈대를 만들어준다.
매우 유용하고 꼭 필요한 기능이 아닐수 없다.
Python에서도 확장모듈을 만들때 이런 쉘스크립트가 있다면 정말 편할 것이다.
--extname옵션에 libformat이라는 확장모듈 이름을 주고 실행해보자.
[root@joon ext]# ./ext_skel --extname=libformat
Creating directory libformat
Creating basic files: config.m4 Makefile.in .cvsignore libformat.c php_libformat.h CREDITS EXPERIMENTAL tests/001.phpt libformat.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/libformat/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-libformat
5. $ make
6. $ ./php -f ext/libformat/libformat.php
7. $ vi ext/libformat/libformat.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/libformat/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
이런 메시지가 나온다면 성공한 것이다. 출력된 comment대로 확장모듈을 만들어 나가면 된다.
1-6 까지 모두 따라해보자.
아래와 같은 결과가 나온다면 성공인 것이다.
[root@joon php-4.1.2]# ./php ext/libformat/libformat.php
X-Powered-By: PHP/4.1.2
Content-type: text/html
Functions available in the test extension:
confirm_libformat_compiled
Congratulations! You have successfully modified ext/libformat/config.m4. Module libformat is now compiled into PHP.
libformat.php는 아까 ext_skel을 실행하였을때 만들어진 테스트 코드다.
ext_skel은 이와같이 테스트코드까지 만들어준다. 정말 편리하다.
내용을 한번 살펴보자.
<?// 확장모듈 libformat이 로드되어 있지 않다면 libformat.so를 동적로드한다.if(!extension_loaded('libformat')) { dl('libformat.so');}$module = 'libformat';// libformat의 함수이름을 array로 가져온다.$functions = get_extension_funcs($module);echo "Functions available in the test extension:<br>\n";// 함수 리스트들을 출력.foreach($functions as $func) { echo $func."<br>\n";}echo "<br>\n";// confirm_libformat_compiled 라는 함수를 실행한다.$function = 'confirm_' . $module . '_compiled';if (extension_loaded($module)) { $str = $function($module);} else { $str = "Module $module is not compiled into PHP";}echo "$str\n";?>
Congratulations! You have successfully modified ext/libformat/config.m4. Module libformat is now compiled into PHP.
라는 문구가 출력되면 성공이다.
또한 한가지 더 확인할 것이 있다.
컴파일된 php화일을 이용하여 phpinfo()를찍어보라.
자 이제 아까 ext_skel을 실행했을때 나온 코멘트데로 7번과 8번 과정을 계속 반복하면서 작업을 해보자.
수환이의 PHP 확장모듈만들기.
1> php 소스 디렉의 ext_skel 로 기본 뻐대를 만든다
# cd /usr/local/src/php5-3-0/ext
# ./ext_skel --extname=suhan_crypt // --extname=모듈명
ext/suhan_crypt 디렉이 만들어짐
2> ext/suhan_crypt 내에 소스를 작성
suhan_crypt.c 와 suhan_crypt.h 를 알맞게 수정한다.
========= suhan_crypt.c 샘플 소스 보기 =====
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_suhan_crypt.h"
static int le_suhan_crypt;
function_entry suhan_crypt_functions[] = {
PHP_FE(suhan_encrypt, NULL) /* 2개의 함수를 만들었따. */
PHP_FE(suhan_decrypt, NULL)
{NULL, NULL, NULL} /* 끝은 무조건 이줄로 끝나야 된다. */
};
zend_module_entry suhan_crypt_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"suhan_crypt",
suhan_crypt_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* 버전부분 */
#endif
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(suhan_crypt)
/* 아래는 본 함수다. 테스트용이라 단순하게 2개의 인수를 입력 받고 앞의 인수를 출력 한다.*/
PHP_FUNCTION(suhan_encrypt)
{
pval **stri,**key;
char *str_char,*key_char,*retval;
if( ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2,&stri,&key) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_string_ex(stri);
convert_to_string_ex(key);
str_char = (*stri)->value.str.val;
key_char = (*key)->value.str.val;
retval = str_char;
RETURN_STRING(retval,1);
}
/* 아래는 본 함수다. 테스트용이라 단순하게 2개의 인수를 입력 받고 뒤의 인수를 출력 한다.*/
PHP_FUNCTION(suhan_decrypt)
{
pval **stri,**key;
char *str_char,*key_char,*retval;
if( ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2,&stri,&key) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_string_ex(stri);
convert_to_string_ex(key);
str_char = (*stri)->value.str.val;
key_char = (*key)->value.str.val;
retval = key_char;
RETURN_STRING(retval,1);
}
suhan_crypt.h 파일도 함수 선언 부분에 2개의 함수를 넣어준다.
/* 사용하지 않는 초기화 함수들은 주석 처리
PHP_MINIT_FUNCTION(suhan_crypt);
PHP_MSHUTDOWN_FUNCTION(suhan_crypt);
PHP_RINIT_FUNCTION(suhan_crypt);
PHP_RSHUTDOWN_FUNCTION(suhan_crypt);
PHP_MINFO_FUNCTION(suhan_crypt);
*/
PHP_FUNCTION( suhan_encrypt); /* 함수선언 */
PHP_FUNCTION( suhan_decrypt); /* 함수선언 */
3>컴파일한다.
# cc -fpic -DCOMPILE_DL=1 -I/usr/local/include -I../../TSRM -I../.. -I../../main -I../../Zend -c -o suhan_crypt.o suhan_crypt.c
# cc -shared -L/usr/local/lib -rdynamic -o suhan_crypt.so suhan_crypt.o
4> 만들어진 so 파일을 사용할 디렉으로 옮긴다.
# cp suhan_crypt/suhan_crypt.so ~사용자/public_html/
# cd ~사용자/public_html
# chown 계정.계정 suhan_crypt.so
# chmod 644 suhan_crypt.so
4> 테스트한다.
so 파일과 htm 파일은 같은 디렉이여야 한다 아니면 so 를 인클루드 디렉으로 카피한다.
<?
if(!extension_loaded('suhan_crypt')) {
dl('suhan_crypt.' . PHP_SHLIB_SUFFIX);
}
$functions = get_extension_funcs('suhan_crypt');
echo "Functions available in the test extension:<br>";
foreach($functions as $func) {
echo $func."<br>";
}
echo "<br>";
echo suhan_encrypt('this is suhan_crypt Module Test','good job');
?>
그래서 그런지 확장모듈에 관련된 질문이 많이 올라오더군요.
어떻게 설치를 해야 하는지.. 등등..
매번 답하기도 귀찮고 ... 그냥 어디 참조하라고 하려니... 스쿨에 없네요.
그래서 올려봅니다. 있는데 제가 못찾은거라면 지적해주시면 자삭하겠습니다.
확장모듈 설치
확장 모듈이란 PHP자체에서 지원하는 기능외의 타 프로그램 라이버러리를 이용하여
함수로써 사용하는것들을 말합니다.
gd mbstring iconv curl 외에도 db 연결하는 함수들등 수없이 많은 기능들이 확장 모듈로
제공됩니다. 그런데 이런 프로그램을 사용하기위해 처음부터 PHP설치시 같이 설치하면
좋긴한데 그러지 못한 경우가 많습니다.
대표적인 예가 mbstring 이나 iconv 같은 함수죠..
utf-8 을 euc-kr 로변경하던지 아니면 그반대의 경우도..
여하튼 이런 mb계열 함수나 iconv 함수를 사용하기위해 서비스를 하고 있는
서버의 PHP를 재설치하기엔 곤란한 경우가 많습니다.
그런경우 확장 모듈로 등록해두고 사용하면 따로 PHP를 재설치 하지 않으셔도 됩니다.
설치 방법이야 여러가지가 있겠지만
가장 보편적으로 사용할수 있는 한가지 방법을 적겠습니다.
아참 제가 적는것은 소스설치에 한정된것입니다.
그리고 php는 /usr/local/php에 설치되었다고 가정하에
1. 같은 버젼의 php 소스 다운로드 또는 원소스가 있다면 소스디렉토리로 이동
2. 압축 풀고 cd PHP소스디렉토리/ext/설치하고자하는확장모듈명
3. /usr/local/php/bin/phpize
4. ./configure --with-php-config=/usr/local/php/bin/php-config --enable-설치하고자하는확장모듈명
5. make => modules/설치하고자하는확장모듈명.so 라는 화일이 생성됨
6. 설치하고자하는확장모듈명.so 이 화일을 php.ini 화일의 extension_dir=확장모듈 경로 에
옮겨줌
7. php.ini 에 extension=설치하고자하는확장모듈명.so 추가
8. 아파치 재시작
대부분의 경우는 이와 똑같이 설치하셔도 문제가 없을겁니다.
물론 이게 정확한것은 아닙니다.
PHP에서 공식지원하지 않거나 또는 버젼이 맞지 않는 확장모듈이 있을수 있습니다.
그런 경우에는 위의 과정과는 조금은 다릅니다.
링크 #1 http://phpschool.com/classroom/phpext/phpext_1.html
링크 #2 http://www.linuxchannel.net/docs/php-ext.txt
PHP Version : 4.3.7
Extended Module : vpopmail-0.2.tar.gz ( http://pecl.php.net/package/vpopmail )
전제 : 시스템에 Qmail+Vpopmail 이 정상작동하고 있어야 합니다.
vpopmail 함수 : http://kr.php.net/manual/en/ref.vpopmail.php
PHP에서 vpopmail 함수를 사용하기 위해서는 PECL 에서 제공하는 확장모듈을 설치해줘야 한다.
작업 디렉토리는 /usr/local/src 이다.
소스디렉토리
/usr/local/src/php-4.3.7
/usr/local/src/vpopmail-0.2
vpopmail.tar.gz 을 풀면 package.xml 이 디렉토리 밖에 생성된다. 이 파일을 압축이 풀린 vpopmail-0.2 디렉토리에
같이 넣어준다. ( 식별을 편하게 하기 위해서.. )
1. PHP 소스 디렉토리안에 ext 디렉토리로 이동한다. 이곳에 ext_skel 파일이 있다.
2. ext_skel 을 이용하여 vpopmail 확장 모듈을 설치한다.
# cd /usr/local/src/php-4.3.7/ext
# ./ext_skel --ext-name=vpopmail --xml=/usr/local/src/vpopmail-0.2/package.xml
3. 설치를 하면 ext 디렉토리에 vpopmail 디렉토리가 생성된다.
4. 상위( /usr/local/src/php-4.3.7 ) 디렉토리로 이동한다.
# cd ../
# ./buildconf --force
5. configuration 을 리빌드 하였다. 아래 명령어를 실행하여 확장모듈 옵션이 정상 빌드되는지 확인한다.
# ./configure --with-vpopmail --enable-vpopmail
# make
6. 위 과정이 정상적으로 끝나면 정식 컴파일을 한다.
# make clean
# < 본인이 컴파일할 옵션을 추가해서 컴파일한다. --with-vpopmail 과 --enable-vpopmail 을 같이 넣는다. )
# make
# ls -la ext/vpopmail
< vpopmail.lo 와 링크파일 vpopmail.o 가 생성되었는지 확인한다. >
# make install
7. PHP 설치를 끝낸 후 phpinfo() 페이지에 vpopmail 모듈이 올라와 있는지 확인한다.
8. vpopmail 함수를 사용하기 위해서는 ext/vpopmail/vpopmail.php 파일을 참고한다.
이상이 vpopmail 확장모듈을 설치하는 방법이었습니다.
[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/
[여담]
안녕하세요. 박준철입니다.
PHP에서 C확장 모듈을 만드는 법에 대한 정리를 몇달간 미뤄오다가 제 홈페이지(http://www.exman.pe.kr) 게시판에 소스코드를 HTML로 변환하여 출력하는 기능이 필요하였습니다.
해서 이참에 정리해 보았습니다.
물론 PHP소스 코드를 HTML로 변환하는 것이라면 php에서 기본으로 제공하는 highlight_string 이라는 훌륭한 함수를 쓰면 됩니다.
제가 필요했던 기능은 다른 프로그램언어(주로 Python)의 소스코드를 미려한 HTML로 변환하는 기능이었습니다.
손안데고 코푸는 격으로 다른 사람이 만든게 없나 찾던중에 PHP로 작성된 모듈을 발견하였는데, 그 모듈의 수행 속도가 너무 느리고, 한글문제도 있어 C로 작성된 다른 프로그램을 찾게 되었습니다.
갑작스럽게 찾은 몇가지 라이브러리중 가장 쓰기 쉽고 빠른 수행속도를 보이는 ibformat(http://daveb.net/format/ ) 를 찾게 되었습니다.
Linux환경에서 libformat을 컴파일한 후 얻은 libformat.so를 이용하여 PHP확장 모듈을 만드것을 소개해 드리겠습니다.
첨부된 예제 파일은 php 소스코드의 ext 디렉토리 아래에 풀어서 컴파일이 가능합니다.
예제의 컴파일 방법은 php를 컴파일 할때 일단 한번 ./buildconf 를 실행 한 후 ./configure에 --with-libformat 옵션을 추가하면 됩니다.
php-4.1.2에서 만들었는데 테스트 결과 4.3.0에서도 문제없이 잘 돌아갑니다.
이 글이 완벽하지 않기 때문에 가급적 예제파일을 실행해보고 마는것 보다 이 글을 따라 직접 만들어 보고 문제점이 발생하였을때 스스로 해결해 나아가는 것이 학습에 큰 도움이 되리라 믿습니다.
글을 신속하게 작성하기 위해 경어는 삼가하였으니 이점 헤아려 주시면 감사하겠습니다. ^^
첨부: libformat.tar.gz
확장 모듈이란 PHP문법을 이용하여 만들수 없는 함수나 오브젝트를 C/C++로 직접 작성하는 것이다.
대표적으로 많이 쓰는 확장모듈은 mysql 관련 함수들이다.
PHP를 처음 배울때에 가장 많이 쓰는 예제중 하나가 mysql 연동 예제이다.
mysql_connect, mysql_query 등은 mysql이 C프로그래머를 위해 제공하는 libmysqlclient 라이브러리를 사용하는 확장모듈이다.
이러한 함수들은 PHP문법을 이용하여 직접만들기가 까다롭거나 불가능하다.
PHP로 만들수 없는 기능이나, C로 구현된 라이브러리가 존재하지만 PHP를 이용하여 급하게 사용해야할 경우, 우리는 C확장모듈을 만들어야 하는 상황에 봉착한다.
그럼 시작해보자.
먼저 http://daveb.net/format/ 에서 libformat-1.5.tar.gz을 받아 컴파일하여 설치하자.
tar -zxvf libformat-1.5.tar.gz
cd libformat-1.5
./configure --prefix=/usr
make
make install
참고 - 소스를 아름다운 HTML로 libformat-1.5
이 작업이 완료되면 아래와 같은 라이브러리들이 만들어진다.
확장자 a는 static library이고, so는 shared object 즉 dll이라고 생각하면 된다.
so.2, so.2.3.0 등은 버전 호환을 위해서 사용하는 soname이다. 그다지 중요하지 않으니까 그냥 넘어가자.
[root@joon ext]# ls /usr/lib/libformat*
/usr/lib/libformat.a /usr/lib/libformat.so /usr/lib/libformat.so.2.3.0
/usr/lib/libformat.la /usr/lib/libformat.so.2
이제 libformat 을 사용하는 PHP확장모듈을 만들어 보자.
내가 사용한 PHP버전은 4.1.2이다. 이것은 4.1의 마지막 버전이며 내가 생각하기에 가장 안정적으로 돌아가는 버전중에 하나이다.
PHP소스를 풀고 ext 디렉토리에 들어가자
[root@joon php-4.1.2]# cd ext/
[root@joon ext]# ls
Makefile cyrus ftp mailparse oci8 recode wddx
Makefile.in db gd mbstring odbc satellite xml
aspell dba gettext mcal openssl session xmlrpc
bcmath dbase gmp mcrypt oracle shmop xslt
bz2 dbplus hyperwave medialand ovrimos skeleton yaz
calendar dbx icap mhash pcntl snmp yp
ccvs domxml iconv ming pcre sockets zip
com dotnet imap mnogosearch pdf standard zlib
cpdf exif informix msql pfpro swf
crack ext_skel ingres_ii mssql pgsql sybase
ctype fbsql interbase muscat posix sybase_ct
curl fdf ircg mysql pspell sysvsem
cybercash filepro java ncurses qtdom sysvshm
cybermut fribidi ldap notes readline vpopmail
여기 보이는 디렉토리들이 모두 확장모듈들이다. 이중 qtdom과 dotnet을 제외한 모든 모듈들은 C로 작성되었다.
qtdom과 dotnet은 C++을 사용한 보기드문 모듈인데, 만약 C++라이브러리를 이용하여 확장모듈을 만들 경우 참고할수 있다.
C++로 PHP확장 모듈로 만드는것에 대한 내용은 다음에 정리하겠다.
ext 디렉토리에는 ext_skel이라는 쉘스크립트가 있는데, 이것은 최초에 확장모듈을 만들기 위한 뼈대를 만들어준다.
매우 유용하고 꼭 필요한 기능이 아닐수 없다.
Python에서도 확장모듈을 만들때 이런 쉘스크립트가 있다면 정말 편할 것이다.
--extname옵션에 libformat이라는 확장모듈 이름을 주고 실행해보자.
[root@joon ext]# ./ext_skel --extname=libformat
Creating directory libformat
Creating basic files: config.m4 Makefile.in .cvsignore libformat.c php_libformat.h CREDITS EXPERIMENTAL tests/001.phpt libformat.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/libformat/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-libformat
5. $ make
6. $ ./php -f ext/libformat/libformat.php
7. $ vi ext/libformat/libformat.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/libformat/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
이런 메시지가 나온다면 성공한 것이다. 출력된 comment대로 확장모듈을 만들어 나가면 된다.
1-6 까지 모두 따라해보자.
아래와 같은 결과가 나온다면 성공인 것이다.
[root@joon php-4.1.2]# ./php ext/libformat/libformat.php
X-Powered-By: PHP/4.1.2
Content-type: text/html
Functions available in the test extension:
confirm_libformat_compiled
Congratulations! You have successfully modified ext/libformat/config.m4. Module libformat is now compiled into PHP.
libformat.php는 아까 ext_skel을 실행하였을때 만들어진 테스트 코드다.
ext_skel은 이와같이 테스트코드까지 만들어준다. 정말 편리하다.
내용을 한번 살펴보자.
<?// 확장모듈 libformat이 로드되어 있지 않다면 libformat.so를 동적로드한다.if(!extension_loaded('libformat')) { dl('libformat.so');}$module = 'libformat';// libformat의 함수이름을 array로 가져온다.$functions = get_extension_funcs($module);echo "Functions available in the test extension:<br>\n";// 함수 리스트들을 출력.foreach($functions as $func) { echo $func."<br>\n";}echo "<br>\n";// confirm_libformat_compiled 라는 함수를 실행한다.$function = 'confirm_' . $module . '_compiled';if (extension_loaded($module)) { $str = $function($module);} else { $str = "Module $module is not compiled into PHP";}echo "$str\n";?>
Congratulations! You have successfully modified ext/libformat/config.m4. Module libformat is now compiled into PHP.
라는 문구가 출력되면 성공이다.
또한 한가지 더 확인할 것이 있다.
컴파일된 php화일을 이용하여 phpinfo()를찍어보라.
자 이제 아까 ext_skel을 실행했을때 나온 코멘트데로 7번과 8번 과정을 계속 반복하면서 작업을 해보자.
수환이의 PHP 확장모듈만들기.
1> php 소스 디렉의 ext_skel 로 기본 뻐대를 만든다
# cd /usr/local/src/php5-3-0/ext
# ./ext_skel --extname=suhan_crypt // --extname=모듈명
ext/suhan_crypt 디렉이 만들어짐
2> ext/suhan_crypt 내에 소스를 작성
suhan_crypt.c 와 suhan_crypt.h 를 알맞게 수정한다.
========= suhan_crypt.c 샘플 소스 보기 =====
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_suhan_crypt.h"
static int le_suhan_crypt;
function_entry suhan_crypt_functions[] = {
PHP_FE(suhan_encrypt, NULL) /* 2개의 함수를 만들었따. */
PHP_FE(suhan_decrypt, NULL)
{NULL, NULL, NULL} /* 끝은 무조건 이줄로 끝나야 된다. */
};
zend_module_entry suhan_crypt_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"suhan_crypt",
suhan_crypt_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* 버전부분 */
#endif
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(suhan_crypt)
/* 아래는 본 함수다. 테스트용이라 단순하게 2개의 인수를 입력 받고 앞의 인수를 출력 한다.*/
PHP_FUNCTION(suhan_encrypt)
{
pval **stri,**key;
char *str_char,*key_char,*retval;
if( ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2,&stri,&key) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_string_ex(stri);
convert_to_string_ex(key);
str_char = (*stri)->value.str.val;
key_char = (*key)->value.str.val;
retval = str_char;
RETURN_STRING(retval,1);
}
/* 아래는 본 함수다. 테스트용이라 단순하게 2개의 인수를 입력 받고 뒤의 인수를 출력 한다.*/
PHP_FUNCTION(suhan_decrypt)
{
pval **stri,**key;
char *str_char,*key_char,*retval;
if( ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2,&stri,&key) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_string_ex(stri);
convert_to_string_ex(key);
str_char = (*stri)->value.str.val;
key_char = (*key)->value.str.val;
retval = key_char;
RETURN_STRING(retval,1);
}
suhan_crypt.h 파일도 함수 선언 부분에 2개의 함수를 넣어준다.
/* 사용하지 않는 초기화 함수들은 주석 처리
PHP_MINIT_FUNCTION(suhan_crypt);
PHP_MSHUTDOWN_FUNCTION(suhan_crypt);
PHP_RINIT_FUNCTION(suhan_crypt);
PHP_RSHUTDOWN_FUNCTION(suhan_crypt);
PHP_MINFO_FUNCTION(suhan_crypt);
*/
PHP_FUNCTION( suhan_encrypt); /* 함수선언 */
PHP_FUNCTION( suhan_decrypt); /* 함수선언 */
3>컴파일한다.
# cc -fpic -DCOMPILE_DL=1 -I/usr/local/include -I../../TSRM -I../.. -I../../main -I../../Zend -c -o suhan_crypt.o suhan_crypt.c
# cc -shared -L/usr/local/lib -rdynamic -o suhan_crypt.so suhan_crypt.o
4> 만들어진 so 파일을 사용할 디렉으로 옮긴다.
# cp suhan_crypt/suhan_crypt.so ~사용자/public_html/
# cd ~사용자/public_html
# chown 계정.계정 suhan_crypt.so
# chmod 644 suhan_crypt.so
4> 테스트한다.
so 파일과 htm 파일은 같은 디렉이여야 한다 아니면 so 를 인클루드 디렉으로 카피한다.
<?
if(!extension_loaded('suhan_crypt')) {
dl('suhan_crypt.' . PHP_SHLIB_SUFFIX);
}
$functions = get_extension_funcs('suhan_crypt');
echo "Functions available in the test extension:<br>";
foreach($functions as $func) {
echo $func."<br>";
}
echo "<br>";
echo suhan_encrypt('this is suhan_crypt Module Test','good job');
?>
관련링크
댓글목록
등록된 댓글이 없습니다.