일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- plugin
- 튜닝
- 웹퍼블리셔
- 사이트제작
- 커스터마이징
- 개발자
- 제이쿼리
- 안드로이드
- 웹디자인
- PHP
- 고도몰
- 홈페이지제작
- 포트폴리오
- jQuery Plugin
- 홈페이지
- 프로그래머
- 웹퍼블리싱
- 쇼핑몰
- 웹디자이너
- JQuery
- 쇼핑몰제작
- CSS
- 3D프린터
- 웹개발자
- 플러그인
- 워크식스
- work6.kr
- 웹에이전시
- 쇼핑몰구축
- 홈페이지구축
- Today
- Total
그냥 개발자 블로그
Create PHP7.x extension for Raspbian 본문
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. 워크식스
'IT소식&팁' 카테고리의 다른 글
프리랜서 디자이너 추천 사이트 - SAVEADESIGN (0) | 2019.04.30 |
---|---|
맥에서 USB 저장장치 완전 초기화 (0) | 2019.04.13 |
쇼핑몰제작 방법 3가지 (0) | 2019.04.02 |
온라인 쇼핑몰 선택이 아닌 필수 (0) | 2019.03.29 |
[워크식스] 고도몰5와 퍼스트몰 기능 개발 비교 (0) | 2019.03.18 |