C 확장을 사용하는 이유
C는 정적으로 컴파일되므로 실행 효율성이 PHP 코드보다 훨씬 높습니다. C를 사용하여 개발된 동일한 연산 코드의 성능은 PHP의 성능보다 수백 배 더 높습니다. CURL과 같은 IO 작업의 경우 시간 소모가 주로 IOWait에 있기 때문에 C 확장에는 뚜렷한 이점이 없습니다.
또한 프로세스가 시작될 때 C 확장이 로드됩니다. PHP 코드는 요청 수명 주기의 데이터만 작동할 수 있으며 C 확장은 더 넓은 범위에서 작동할 수 있습니다.
추천 강좌: PHP 튜토리얼.
1단계
php-5.4와 같은 PHP 소스 코드를 다운로드하세요. .16. 압축을 푼 후 php-5.4.16ext 디렉터리로 들어갑니다. ./ext_skel –extname=myext를 입력합니다. myext는 확장명 이름이며 실행 후 myext 디렉터리가 생성됩니다.
ext_skel은 PHP 확장 뼈대 코드를 생성하기 위해 PHP에서 공식적으로 제공하는 도구입니다.
cd myext. php_myext.h, myext.c, config.m4 등과 같은 여러 파일을 볼 수 있습니다. config.m4는 다양한 컴파일 옵션을 수정하는 데 사용되는 AutoConf 도구의 구성 파일입니다.
두 번째 단계
config.m4를 수정하고
dnl PHP_ARG_WITH(myext, for myext support, dnl Make sure that the comment is aligned: dnl [ --with-myext Include myext support])
을
PHP_ARG_WITH(myext, for myext support, [ --with-myext Include myext support])# 🎜로 변경합니다. 🎜#아래에는 –enable-myext도 있는데, 이는 PHP 커널로 컴파일된다는 의미입니다. with는 동적 링크 라이브러리로 로드됩니다.
세 번째 단계
php_myext.h를 수정하고 PHP_FUNCTION(confirm_myext_compiled)을 참조하세요. PHP_FUNCTION(myext_helloworld) 라인은 myext_helloworld의 확장 함수를 선언하는 것을 의미합니다. 그다음 확장기능 구현 부분인 myext.c를 수정합니다.const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */ };여기 코드는 함수 포인터를 Zend 엔진에 등록하고 PHP_FE(myext_helloworld, NULL) 줄을 추가하는 것입니다(뒤에 세미콜론을 포함하지 마세요).
4단계
myext.c 끝에 myext_helloworld의 실행 코드를 추가합니다.PHP_FUNCTION(myext_helloworld) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!\n"); RETRUN_TRUE; }zend_parse_parameters는 PHP가 전달한 매개변수를 받아들이는 데 사용되며 RETURN_XXX 매크로는 데이터를 PHP로 반환하는 데 사용됩니다.
5단계
myext 디렉터리에 phpize, ./configure, make, make를 차례로 실행합니다. 그런 다음 php.ini를 수정하여 Extension=myext.soExecute php -r "myext_helloworld('test');"를 추가하고 hello world!를 출력합니다.
위 내용은 PHP 확장을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!