그냥 개발자 블로그

Create PHP7.x extension for Raspbian 본문

IT소식&팁

Create PHP7.x extension for Raspbian

마음이파파 2019. 4. 7. 17:06

 

PHP7.x 이상에서 사용가능한 extension 만들기 위해 인터넷에서 자료를 찾아봤지만 오래되거나 제대로 된 자료가 아니여서 번번히 실패하였습니다. 특히 데비안 계열의 리눅스에서 php extension 개발 방법을 찾기란 쉽지 않았습니다. 일주일 동안 PHP의 binary 파일과 아파치의 extension 구조 분석 끝에 만드는데 성공하였으며, 방법을 공유 합니다.

 

 

 

개발 환경

- Raspbian (OS)

- PHP7.0.3

 

테스트 환경

- Apache2

 

 

 

 

 

 

 

 

1. 개발 환경 준비

 

개발 완료 후 테스트 할 아파치 서버를 설치

 

apt-get install apache2

 

PHP 설치

 

apt-get install php

 

PHP 개발 툴 설치

 

apt-get install php-dev

 

 

 

 

 

 

 

2. extension 개발 디렉토리 만들기

 

여기서는 sample 이라는 extension을 만들것 입니다. 원하는 위치에 sample 디렉토리를 만들어 줍니다.

 

mkdir sample

 

디렉토리로 이동 합니다.

 

cd sample

 

 

 

 

 

 

 

3. extension 개발 설정 파일을 만들기 위한 리눅스용 설정 파일 만들기

 

vi config.m4

 

아래 내용과 동일하게 작성 합니다.

 

PHP_ARG_ENABLE(sample,
  [Whether to enable the "sample" extension],
  [  --enable-sample        Enable "sample" extension support])

if test $PHP_SAMPLE != "no"; then
  PHP_SUBST(SAMPLE_SHARED_LIBADD)
  PHP_NEW_EXTENSION(sample, sample.c, $ext_shared)
fi

 

 

 

 

 

 

 

4. 헤더 파일 만들기

 

vi php_sample.h

 

아래 내용과 동일하게 작성 합니다.

 

#ifndef PHP_SAMPLE_H
#define PHP_SAMPLE_H

#define PHP_SAMPLE_EXT_NAME  "sample"
#define PHP_SAMPLE_EXT_VERSION  "1.0"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */

#include "php.h"

#ifdef ZTS
#include "TSRM.h"
#endif

#if defined(ZTS) && defined(COMPILE_DL_SAMPLE)
ZEND_TSRMLS_CACHE_EXTERN()
#endif

#endif /* PHP_SAMPLE_H */

 

 

 

 

 

 

 

5. extension 기능 C언어 파일 만들기

 

vi sample.c

 

아래 내용과 똑같이 작성 합니다.

 

#include "php_sample.h"

PHP_FUNCTION(sample);

zend_function_entry sample_functions[] = {
    PHP_FE(sample, NULL){NULL, NULL, NULL}
};


zend_module_entry sample_module_entry = {
STANDARD_MODULE_HEADER,
PHP_SAMPLE_EXT_NAME,
sample_functions,
NULL, /* MINIT */
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
PHP_SAMPLE_EXT_VERSION,
STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_SAMPLE
#ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
#endif
ZEND_GET_MODULE(sample)
#endif

PHP_FUNCTION(sample){
php_printf("abc");
}

 

 

 

 

 

 

 

 

6. extension 컴파일에 필요한 파일들 만들기

 

phpize

 

정상적으로 만들어 졌다면 sample 디렉토리 안에 configure 파일을 보실 수 있습니다.

 

ls

acinclude.m4 config.h.in    configure     Makefile modules

aclocal.m4 config.log     configure.in  Makefile.fragments  php_sample.h

autom4te.cache config.m4      include     Makefile.global run-tests.php

build config.nice    install-sh    Makefile.objects sample.c

config.guess config.status  libtool     missing sample.la

config.h config.sub     ltmain.sh     mkinstalldirs sample.lo

 

 

 

 

 

 

 

7. 컴파일 설정 업로드 하기

 

sh configure

 

 

 

 

 

 

 

8. 컴파일하기

 

make

 

정상적으로 컴파일 된었다면 modules 디렉토리 내에 sample.so 파일이 만들어 집니다.

 

 

ls ./modules

 

 

 

 

실제 extension 개발은 여기서 끝 입니다.

9번 부터는 테스트 과정 입니다. 

 

 

 

 

 

 

 

9. PHP extension 디렉토리로 모듈 이동 시키기

 

make install  

 

자동으로 sample.so 파일이 이동 됩니다.

또는 phpinfo() 로 extension 경로를 확인하여 cp 명령어로 sample.so 를 이동 시켜도 됩니다.

 

 

 

 

 

 

 

 

10. php.ini 에 모듈 설정 하기

 

php.ini 에서 extension=gd.so 와 같이 확장 모듈이 설정 된 부분이 있습니다. 

하단에 extension=sample.so 하여 만든 모듈을 설정해 줍니다.

 

이 부분은 서버 환경에 따라 또는 Apache와 PHP 설치 방법에 따라 다를 수 있습니다.

 

Raspbian의 경우 php.ini 에서 conf.d 를 import 하고 그안에 심볼릭 파일들이 다시 mods-available 디렉토리의 *.ini 설정 파일들을 가리키고 있습니다. 따라서 mods-available 디렉토리 안에 sample.ini 파일을 만들어 extension=sample.so 를 입력해주고 conf.d 디렉토리에 심볼릭 링크를 만들어 줘야 합니다.

 

 

 

 

 

 

11. 아파치 재실행

 

새로운 모듈이 적용되려면 Apache를 재시작 해줘야 합니다.

 

service apache2 restart

 

 

 

 

 

 

 

12. 모듈 로드 검사

 

phpinfo에서 다음을 찾을 수 있다면 정상적으로 로드된 것 입니다.

 

 

 

 

 

 

 

13. 테스트 

 

다음과 같이 php 파일을 하나 만들어 테스트 해봅니다.

 

<?php 

 

if(extension_loaded('sample')){

sample();

}

 

?>

 

abc가 출력된다면 성공 입니다.

 

 

 

 

 

 

 

14. 배포

 

PHP extension 은 배포를 목적으로 만드는 경우가 많습니다.

배포방법은 쉽습니다.

 

config.m4, sample.c, php_sample.h 파일만 골라서 설치를 원하는 서버에 넣고 6번 부터 차례로 실행해 주면 됩니다.
모듈 설치가 성공 했다면 config.m4, sample.c, php_sample.h 파일이 있는 디렉토리를 삭제하여 extension 디렉토리 내에 sample.so 만 남기면 됩니다.

 

 

 

 

 

 

예제 파일이 필요하다면 워크식스 홈페이지를 통해 문의 주세요.

 

 

 

 

 

copyright ⓒ 2019. 워크식스