이 기사에서는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!