PHP 확장 개발 입문 강좌
저 는 이 시리즈 의 박문 에서 PHP 확장 개발 에 관 한 학습 과 깨 달 음 을 정리 하고 리 눅 스 시스템 에서 PHP 확장 이 갖 춰 야 할 가장 기본 적 인 지식 을 간단명료 하 게 묘사 하려 고 합 니 다.수준 이 비교적 낮 으 니 잘못 이 있 을 수 있 으 니 지적 해 주시 기 바 랍 니 다.
준비 작업
먼저 PHP 원본 코드(Github 에서 서명 하거나 홈 페이지 에서 최신 안정 판 을 다운로드 할 수 있 음)를 가 져 와 서 컴 파일 해 야 합 니 다.컴 파일 속 도 를 높이 기 위해 서 는 모든 추가 확장(--disable-all 옵션 사용)을 사용 하지 않 는 것 을 추천 합 니 다.단,debug(--enable-debug 옵션 사용)와 스 레 드 보안(--enable-maintainer-zts 사용)을 열 고 확장 을 발표 할 때 debug 를 닫 는 것 이 좋 습 니 다.상황 에 따라 스 레 드 보안 을 열 어야 하 는 지 여 부 를 선택 하 십시오.
$ ./buildconf --force
$ ./configure --disable-all --enable-debug --enable-maintainer-zts
$ make
필요 한 것 이 아니 기 때문에,우 리 는--prefix 옵션 을 지정 하지 않 았 습 니 다.출력 정 보 를 보 려 면 의존 패 키 지 를 설치 해 야 PHP 를 성공 적 으로 컴 파일 할 수 있 습 니 다.컴 파일 된 PHP 의 실행 가능 한 프로그램 은 원본 코드 의 sapi 디 렉 터 리 에서 서로 다른 숙주 환경 에 대응 하 는 하위 디 렉 터 리 가 있 습 니 다.우 리 는 앞으로 주로 cli(command line interface)환경 을 사용 하여 별명 을 만 들 수 있 습 니 다.
$ alias php-dev=/usr/local/src/php-5.6.5/sapi/cli/php
일부 명령 행 옵션 은 매우 유용 합 니 다.
php-dev -h #
php-dev -v #
php-dev --ini #
php-dev -m #
php-dev -i # phpinfo
php-dev -r <code> # code
골격 을 넓히다PHP 의 모든 공식 확장 은 원본 ext 디 렉 터 리 에 있 으 며,우리 가 쓴 확장 도 이 디 렉 터 리 에 놓 을 수 있 습 니 다.이 디 렉 터 리 아래 에 ext 라 는 이름 이 있 습 니 다.skel 의 셸 스 크 립 트 는 PHP 확장 골격 을 만 드 는 데 사 용 됩 니 다.이 스 크 립 트 를 사용 하면 PHP 확장 을 빠르게 만 들 수 있 습 니 다.
$ ./ext_skel --extname=myext
위의 명령 은 my ext 라 는 확장 자 를 만 들 었 습 니 다.원본 코드 는 my ext 디 렉 터 리 에 있 습 니 다.인자 없 이 이 스 크 립 트 를 실행 하면 도움말 정 보 를 인쇄 할 수 있 습 니 다.이 스 크 립 트 가 제공 하 는 더 많은 옵션 을 볼 수 있 습 니 다.다음은 우리 의 확장 을 완성 합 시다.myext 디 렉 터 리 에 들 어가 config.m4 프로필 을 편집 하고 PHP 를 찾 습 니 다.ARG_ENABLE 매크로 함수,앞의 dnl 주석 제거(총 3 줄).원본 루트 디 렉 터 리 로 되 돌려 주 고 buildconf,configure,make 명령 을 다시 실행 합 니 다.
$ ./buildconf --force
$ ./configure --help | grep myext
--enable-myext Enable myext support
$ ./configure --disable-all --enable-myext --enable-debug --enable-maintainer-zts
$ make
.../configure--help|grep my ext 로 확 장 된 로 딩 상황 을 인쇄 했 습 니 다.아래 출력 이 보이 지 않 으 면 확장 이 설정 되 지 않 았 음 을 설명 합 니 다.config.m4 파일 을 다시 확인 하 십시오.대부분의 코드 가 이미 컴 파일 되 었 기 때문에 이번 컴 파일 은 매우 빠 를 것 이다.PHP 는 또 다른 컴 파일 확장 방법(동적 연결 방식 을 사용 하여 확장 을.so 파일 로 컴 파일 합 니 다)이 있 습 니 다.그러나 확장 을 개발 할 때 정적 컴 파일 을 사용 하 는 것 을 추천 합 니 다.설정 파일 에 확장 을 불 러 오 는 절 차 를 줄 이기 때 문 입 니 다.
모든 것 이 순조롭다 면 우리 의 첫 번 째 확장 은 이미 실 행 될 수 있다.
$ php-dev -m | grep myext
myext
$ php-dev -r 'echo confirm_myext_compiled("myext") . "
";'
Congratulations! You have successfully modified ext/myext/config.m4. Module myext is now compiled into PHP.
첫 번 째 명령 은 확장 이 불 러 왔 음 을 보 여 줍 니 다.두 번 째 명령 은 ext 를 실 행 했 습 니 다.skel 확장 골격 이 자동 으로 만들어 지 는 함수 입 니 다.물론 이 함 수 는 의미 가 없 지만 우 리 는 쉽게 이 함 수 를 hello World 로 개편 할 수 있다.수 동 생 성 확장
대부분의 튜 토리 얼 은 extskel 확장 골격 을 원형 으로 확장 개발 을 설명 하 는 방법 은 당연히 편리 하고 빠르다.그러나 저 는 개인 적 으로 순수한 수공 개발 확장 방식 을 더 좋아 합 니 다.왜냐하면 그 중의 모든 세부 사항 을 이해 하기 쉽 기 때 문 입 니 다.
확장 자 를 수 동 으로 만 들 고 ext 디 렉 터 리 에 들 어가 서 확장 디 렉 터 리 my ext 2 를 만 듭 니 다.몇 개의 파일 이 필요 합 니 다:config.m4,my ext 2.c 와 ppmyext2.h。
우선 설정 파일 config.m4 를 작성 합 니 다:
PHP_ARG_ENABLE(myext2, whether to enable myext2 support,
[ --enable-myext2 Enable myext2 support])
if test "PHP_MYEXT2" != "no"; then
PHP_NEW_EXTENSION(myext2, myext2.c, $ext_shared)
fi
config.m4 는 사실 autoconf 프로그램 에서 사용 하 는 프로필 입 니 다.autoconf 는 autotools 도구 상자 의 중요 한 구성 입 니 다.autoconf 의 용법 을 완전 하 게 소개 하 는 데 는 오 랜 시간 이 필요 합 니 다.다행히 우리 가 있 는 이곳 의 용법 은 매우 간단 합 니 다.PHP_ARG_ENABLE 는 PHP 가 autoconf 로 정의 하 는 매크로 함수 입 니 다.my ext 2 는 첫 번 째 매개 변수 로 확장 이름 을 지 적 했 습 니 다.뒤의 두 인 자 는 make 와 configure 가 실 행 될 때 만 표시 되 기 때문에 우 리 는 마음대로 쓸 수 있 습 니 다.[]autoconf 문법 에서 의 역할 은 작은 따옴표 와 유사 합 니 다.문자열 을 감 싸 는 데 사 용 됩 니 다.(두 번 째 매개 변수 에 빈 칸 이 포함 되 어 있 지만 괄호 를 사용 하지 않 아 도 됩 니 다.)그리고 네 번 째 매개 변 수 는 확장 기본 값 이 켜 지 는 지 닫 는 지(yes 또는 no)를 가리 키 는 데 사 용 됩 니 다.기본 값 은 no 입 니 다.
아래 세 줄 은 사실 셸 문법 입 니 다.우리 가 PHP 를 열 었 는 지 여 부 를 판단 합 니 다.MYEXT 2 확장 모듈.이 확장 모듈(--enable-myext 2)을 열 었 다 면$PHPMYEXT 2 변수의 값 은 no 가 아니 므 로 PHP 를 실행 합 니 다.NEW_EXTENSION 매크로.이 매크로 함수 도 PHP 가 autoconf 로 정의 하 는 확장 문법 입 니 다.첫 번 째 매개 변 수 는 확장 이름 입 니 다.두 번 째 매개 변 수 는 컴 파일 할 C 파일 을 확장 하 는 것 입 니 다.여러 개 있 으 면 순서대로 쓰 면 됩 니 다(빈 칸 구분).세 번 째 매개 변 수 는$ext 입 니 다.shared。
다음은 php 작성my ext 2.h 헤더 파일,이 파일 의 이름 은 PHP 확장 규범 인 pp 입 니 다.확장자.h:
#ifndef PHP_MYEXT2_H
#define PHP_MYEXT2_H
extern zend_module_entry myext2_module_entry;
#define phpext_myext2_ptr &myext2_module_entry
#define PHP_MYEXT2_VERSION "0.1.0"
/* prototypes */
PHP_FUNCTION(hello);
#endif /* PHP_MYEXT2_H */
여기 서 주요 코드 는 phpext 라 고 정의 되 어 있 습 니 다.myext2_ptr 의 매크로,PHP 바 텀 은 이 매크로 를 통 해 우리 의 확장 을 참조 합 니 다.이 매크로 의 이름 은 똑 같이 규범 적 인 것 임 을 알 수 있다.확장자ptr。그리고 myext 2module_entry 는 우리 가 잠시 후에 c 파일 에서 정의 할 구조 체 이 며,그 이름 도 규범 화 된 확장자 입 니 다.module_entry。그 밖 에 우 리 는 확장 버 전 번호 의 매크로 와 함수 원형(PHP 를 통 해)을 정의 했다.기능 매크로,PHPFUNCTION 매크로 함수 의 매개 변 수 는 외부 에서 사용 할 수 있 는 함수 명 입 니 다).잠시 후에 이 함 수 를 실현 하 겠 습 니 다.
마지막 으로 my ext 2.c 파일 의 실현 을 살 펴 보 겠 습 니 다.
#include "php.h"
#include "php_myext2.h"
/* {{{ myext2_functions[]
*
* Every user visible function must have an entry in myext2_functions[].
*/
static const zend_function_entry myext2_functions[] = {
PHP_FE(hello, NULL)
PHP_FE_END
};
/* }}} */
/* {{{ myext2_module_entry
*/
zend_module_entry myext2_module_entry = {
STANDARD_MODULE_HEADER,
"myext2", /* module name */
myext2_functions, /* module functions */
NULL, /* module initialize */
NULL, /* module shutdown */
NULL, /* request initialize */
NULL, /* request shutdown */
NULL, /* phpinfo */
PHP_MYEXT2_VERSION, /* module version */
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_MYEXT2
ZEND_GET_MODULE(myext2)
#endif
/* {{{ proto void hello()
Print "hello world!" */
PHP_FUNCTION(hello)
{
php_printf("hello world!
");
}
/* }}} */
뼈 대 를 확장 하여 만 든 c 파일 을 비교 해 보면 우리 의 c 파일 은 매우 간단 하 다 는 것 을 알 수 있 습 니 다.사실은 이것 은 가장 기본 적 인 확장 에 있어 서 충분 합 니 다.위의 코드 는 간단 하고 뚜렷 하 며 대부분의 주석 은 이미 설명 성 이 있다.우 리 는 다시 간략하게 요약 한다.
1.처음에 우리 가 사용 할 헤더 파일 을 포함한다.pp.h 는 필수 입 니 다.이것 은 우리 가 사용 할 수 있 는 절대 다수의 표준 라 이브 러 리 파일 을 포함 하고 있 습 니 다.예 를 들 어 stdio.h,stdlib.h 등 입 니 다.
2.myext2_functions 는 우리 가 드 러 낼 함수 로 구 성 된 구조 체 배열 을 정의 합 니 다.모든 요 소 는 PHP 를 통 해FE 매크로 가 지정 합 니 다.PHP_FE 매크로 는 두 개의 매개 변수 가 있 습 니 다.첫 번 째 는 외부 에서 사용 할 수 있 는 함수 이름 이 고 두 번 째 는 매개 변수 정보 입 니 다.(여기 서 NULL 을 간단하게 사 용 했 습 니 다)마지막 요 소 는 PHP 여야 합 니 다.FE_END。주석 을 주의 하 십시오.외부 에 노출 될 모든 함 수 는 이 구조 체 배열 에서 정의 되 어야 합 니 다.
3.myext2_module_entry 는 우리 의 모듈 정 보 를 정 의 했 습 니 다.이것 은 구조 체 이 고 대부분의 속성 은 주석 을 통 해 설명 되 었 습 니 다.중간 에 있 는 다섯 개의 함수 지침 을 주의 하 십시오.우 리 는 모두 NULL 로 간단하게 설정 하고 후속 블 로그 에서 그들의 용법 을 설명 할 것 입 니 다.
4.ZEND_GET_MODULE(my ext 2)매크로 함 수 는 ifdef 매크로 에 포함 되 어 있 기 때문에 호출 여 부 는 상황 에 따라 결정 된다.어떤 상황 에서 호출 되 고 어떤 상황 에서 호출 되 지 않 는 지 에 대해 서 는 후속 블 로그 에서 설명 할 것 이다.
5.마지막 몇 줄 코드 는 hello 함 수 를 실 현 했 습 니 다.아주 간단 합 니 다.php 를 호출 합 니 다.printf 출력 hello world!줄 바 꿈 문자 와 phpprintf 의 용법 은 printf 와 완전히 같다.
6.주석 에 있 는{{{와}}}은 vim 등 편집기 의 접 기 편 의 를 위해 사 용 됩 니 다.주석 도 이렇게 쓰 는 것 을 추천 합 니 다.
이 안 에는 PHP 와 같은 매크로 가 포함 되 어 있 습 니 다.FE,PHP_FE_END,PHP_FUNCTION 등 이 매크로 들 을 완전 하 게 소개 하려 면 후속 적 인 박문 에 들 어가 야 한다.현재 가장 간단 한 방법 은 바로 이 매크로 들 을 기억 하 는 것 이다.
모든 파일 의 이름,변수의 이름,빈 칸 과 들 여 쓰기,주석 등 이 매우 규범 적 이라는 것 을 알 게 되 었 습 니 다.이 규범 에 따라 우리 가 작성 한 코드 와 PHP 자체 의 코드 가 더욱 일치 할 수 있 습 니 다.우 리 는 또한 이러한 규범 을 사용 하여 PHP 확장 을 개발 하 는 것 을 추천 합 니 다.
마지막 으로,우리 의 확장 자 를 컴 파일 하여 실행 합 니 다:
$ ./buildconf --force
$ ./configure --help | grep myext2
--enable-myext2 Enable myext2 support
$ ./configure --disable-all --enable-myext2 --enable-debug --enable-maintainer-zts
$ make
$ php-dev -m | grep myext2
myext2
$ php-dev -r 'hello();'
hello world!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.