1. Skeleton 생성
PHP 소스 디렉토리의 ext 디렉토리에 있는 ext_skel 실행
php-1.4.2/ext]# ./ext_skel --extname=[확장모듈명]
ext 디렉토리에 [확장모듈명]으로 디렉토리 생성됨
ls -al php-1.42./ext/[확장모듈명]
[확장모듈명].c
php_[확장모듈명].h
2. C 라이브러리 함수와 PHP 함수의 연결
1) [확장모듈명].c 에 C 라이브러리 함수와 연결할 PHP 함수를 등록함
function_entry [확장모듈명]_functions [] = {
PHP_FE( [PHP함수명1], NULL)
PHP_FE( [PHP함수명2], NULL)
{NULL, NULL, NULL}
};
2) PHP 함수와 C 라이브러리 함수의 연결 (PHP 함수 정의)
PHP_FUNCTION ( [PHP함수명] )
{
/* 아규먼트 파싱 */
if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ... ) == FAILURE ) return;
/* 파싱 방법 ( ... ) */
/* 아규먼트 타입 지정 */
/* s : string 타입 (문자열 길이 저장을 위한 변수 필요) */
/* l : long 타입 */
/* 예 ) */
/*
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &var_long);
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &var_str, &var_len);
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &var_str, &var_len, &var_long);
*/
/* C 라이브러리 함수 실행 */
[C함수]( ... );
RETURN_STRING( [문자열], 1); /* 웹 브라우저에 출력 ? */
}
3) PHP 함수 헤더에 프로토타입 추가 ( php_[확장모듈명].h )
PHP_FUNCTION( [PHP함수명] );
3. PHP 확장 모듈 라이브러리 작성 방법
1) PHP skeleton 컴파일
gcc -fpic -DCOMPILE_DL_[확장모듈명]=1 \
-I/usr/local/include -I../../TSRM -I../.. -I../../main -I../../Zend -I.
-c -o [확장모듈명].o [확장모듈명].c
2) PHP 확장 모듈 라이브러리 생성
gcc -shared -L/usr/local/lib -rdynamic -o [확장모듈명].so \
[확장모듈명].o [C 오브젝트 파일]
5. PHP Extension Module의 사용
1) Apache 설정
PHP 모듈 동적 로딩 시 추가
LoadModule php4_module libexec/libphp4.so # PHP 재설치시 자동 추가
AddType application/x-httpd-php .php .html .htm # 없으면 추가
AddType application/x-httpd-php-source .php3 # 없으면 추가
2) PHP 확장 모듈 설정
PHP 설치 디렉토리의 php.ini-dist 파일을 php.ini 파일로 변경하여 [php설치경로]/lib에 복사
php.ini 파일 수정
extension_dir = "[아파치모듈라이브러리경로]"
예) extension_dir = "/usr/local/apache/libexec"
새로 생성한 [확장모듈].so 파일을 [아파치모듈라이브러리경로]에 복사
3) PHP 모듈(libphp4.so) 동적 링크 + PHP 확장 모듈 동적 링크
Apache 재설치
./configure --prefix=[설치경로] --enable-module=so
make
make install
PHP 재설치
./configure --prefix=[설치경로] --with-apxs=[아파치apxs경로] --with-[확장모듈명]=shared
make
make install
4) PHP 모듈 동적 링크 + PHP 확장 모듈 정적 링크
Apache 재설치
./configure --prefix=[설치경로] --enable-module=so
make
make install
PHP 재설치
./configure --prefix=[설치경로] --with-apxs=[아파치apxs경로] --with-[확장모듈명]
make
make install
5) PHP 모듈(libphp4.a) 정적 링크 + PHP 확장 모듈 동적 링크
Apache 재설치
./configure --prefix=[설치경로] --activate-module=[아파치모듈라이브러리경로]/libphp4.so
make
make install
PHP 재설치
./configure --prefix=[설치경로] --with-apache=[아파치설치경로] --with-[확장모듈명]=shared
make
make install
6) PHP 모듈 정적 링크 + PHP 확장 모듈 정적 링크
Apache 재설치
./configure --prefix=[설치경로] --activate-module=[아파치모듈라이브러리경로]/libphp4.so
make
make install
PHP 재설치
./configure --prefix=[설치경로] --with-apache=[아파치설치경로] --with-[확장모듈명]
make
make install
????
PHP의 소스 configure 전에 ./buildconf 실행 하면, 소스의 ext 디렉토리의 하위에 있는 모듈 디렉토리에 대한 정보를 configure에 포함시키는 것 같음.
따라서, 새로 생성한 확장 모듈이 PHP 모듈(libphp4.so)에 포함되게 되어 확장 모듈의 동적 링크를 사용하지 못함