>  기사  >  백엔드 개발  >  PHP 확장 기본 학습

PHP 확장 기본 학습

小云云
小云云원래의
2018-01-25 17:18:451543검색

이 기사에서는 주로 PHP 확장을 작성하는 방법을 소개합니다. PHP 확장을 생성하는 방법부터 시작하겠습니다.

PHP는 C 언어로 작성되었습니다. 모든 PHPer에게는 확장 기능을 작성하고 싶은 내면의 충동이 있습니다. 그러나 좋은 진입점이 부족합니다. PHP 확장 개발을 구글에서 검색해 보면 대부분 복사된 글이고, 심지어 운영도 하지 않은 채 자신의 블로그에 올리는 사람도 있다. 그러나 몇 가지 좋은 튜토리얼이 있지만 모두 PHP 5 시대의 제품이며 숨겨진 함정이 많이 있습니다. 천천히 구덩이를 밟아가는 과정을 기록해두고, 어쩌면 이것이 다른 사람들에게 '튜토리얼'이 될 수도 있겠네요.

확장 프로그램 생성

많은 사람들이 많은 온라인 튜토리얼을 봤을 것입니다. 대부분은 $./ext_skel--extname=extname 명령을 실행하도록 가르칩니다. 그러나 PHP 소스 코드를 복제하면 master 브랜치 아래에 ext/ext_skel 파일이 없다는 것을 알 수 있습니다. 그래서 정리해봤습니다.

PHP의 소스코드를 직접 다운로드 받거나, 출시된 버전에서 다운로드하면 이 명령을 실행할 수 있습니다.

$ cd ext
$ ./ext_skel --extname=extname

마스터 브랜치 바로 아래에 있으면 ext_skel.php 파일만 있습니다. , 이때 이 PHP 파일을 직접 실행할 수 있습니다

$ cd ext
$ php ext_skel.php --ext extname

마스터 브랜치 아래에서 직접 개발했기 때문에 다음 작업은 기본적으로 모두 마스터 브랜치 아래에 있습니다.

확장 프로그램을 생성하면 파일 4개와 폴더 1개가 표시됩니다. 이 단계에서는 .c 파일과 .h 파일이라는 두 개의 파일만 사용하면 됩니다.

작은 함정

확장을 생성한 후 컴파일을 시도할 수 있습니다.

$ phpize
$ ./configure
$ make &&make test

컴파일하는 동안 경고가 표시된다는 사실에 놀랄 것입니다.

warning:implicitdeclaration of function
'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration]
ZEND_PARSE_PARAMETERS_NONE();
^

1개의 경고가 생성되었습니다.

그런 다음 make 테스트를 실행하고 테스트 하나가 실패했음을 확인합니다. 맞습니다. 우리를 위해 스크립트로 생성된 파일은 실제로 우리 자체 테스트에 실패했습니다. 이상하다고 생각하시나요? 구체적인 경고 내용을 살펴보겠습니다. ZEND_PARSE_PARAMETERS_NONE 함수를 찾을 수 없습니다. 파일을 찾아보니 15번째 줄에 있었습니다. 함수 이름을 보면 무슨 뜻인지 짐작할 수 있을 것입니다. 그래서 PHP 소스코드를 검색해 봤습니다. 그러나 우리는 그러한 거시적 정의를 찾았습니다.

#ifndefzend_parse_parameters_none
#definezend_parse_parameters_none()
zend_parse_parameters(ZEND_NUM_ARGS(),"")
#endif

원래 대문자를 바꾼 후에는 더 이상 경고가 표시되지 않습니다. 이것은 우리를 위해 작은 구멍을 파는 공무원이라고 볼 수 있습니다. 대문자에 대한 매크로 정의가 있지만 왜 오류가 보고되는지 잘 모르겠습니다.

함수 정의

대부분의 사람들이 확장 기능을 작성할 때 최소한 하나의 함수를 구현하기를 희망한다고 생각합니다. 확장 기능을 작성하기 위해 몇 가지 전역 변수만 필요한 것은 아닙니다. (fog

여기서 PHP는 확장 기능을 제공합니다. 유용한 매크로 PHP_FUNCTION도 있습니다. 예를 들어, PHP_FUNCTION(이름)은 결국 voidzif_name(zend_execute_data*execute_data,zval)*return_value)로 변환됩니다. 동시에 우리는 그러한 배열이 정의된 것을 볼 수 있습니다

constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE_END
};
constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE(name,NULL)
PHP_FE_END
};

끝에 세미콜론이나 쉼표를 추가하지 마십시오. 마지막으로 이 함수를 출력할 수 있습니다.

PHP_FUNCTION(name)
{
php_printf("Hellon");
}

컴파일 및 설치 후에 이 함수를 사용할 수 있습니다.

관련 권장 사항:

PHP 확장을 위한 Tencent CMEM 편집

PHP 확장을 위한 확장 프레임워크 자동 생성

PHP 확장을 작성하는 방법

위 내용은 PHP 확장 기본 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.