PHP 확장 모듈을 이용한 C 라이브러리 사용

by 조쉬 posted Oct 27, 2018
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

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)에 포함되게 되어 확장 모듈의 동적 링크를 사용하지 못함