모든 PHP 확장을 구성하려면 최소한 두 개의 파일이 필요합니다. 즉, 어떤 파일을 빌드해야 하는지, 어떤 외부 라이브러리가 필요한지 컴파일 시간을 알려주는 구성 파일과 실제 작업을 수행하는 최소한 하나의 소스 파일입니다. Extension
사실 일반적으로 두 번째 또는 세 번째
구성 파일과 하나 이상의 헤더 파일이 있습니다. 첫 번째 확장의 경우 각 유형별로 하나의 파일을 추가하고 작업해야 합니다. 구성 파일
시작하려면 먼저 PHP 소스 코드 디렉터리 트리의 ext/ 디렉터리에 샘플이라는 디렉터리를 만듭니다. 실제로 이 새 디렉터리는 어디에나 배치할 수 있지만 나중에 win32 및 static을 보여주기 위해 사용됩니다. 장 빌드 옵션의 경우 먼저 소스 코드 디렉터리에서 빌드하겠습니다.
다음으로 이 디렉터리에 들어가서 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
이것은 실행 중에 호출할 수 있는 활성화입니다. ./configure 샘플 옵션에 대한 최소 요구 사항. PHP_ARG_ENABLE에 대한 두 번째 인수는 ./configure 처리 중에 이 확장 구성 파일에 도달하면 표시됩니다. 세 번째 인수는 최종 사용자가 ./configure를 실행할 때 도움말 정보로 표시됩니다.
왜 일부 확장 구성에서는 활성화-extname을 사용하고 다른 확장 구성에서는 with-extname을 사용하는지 궁금한 적이 있습니까? 실제로 활성화는 이 기능을 활성화하는 데 다른 타사가 필요하지 않음을 의미합니다. 반면에 는 이 기능을 사용하기 위한 다른 전제 조건이 있음을 나타냅니다.
이제 샘플 확장을 다른 라이브러리와 연결할 필요가 없으므로 17장 "외부 라이브러리"에서 활성화 버전만 사용해야 합니다. , with 사용을 소개하고 추가 CFLAGS 및 LDFLAGS 설정을 사용하도록 컴파일러에 지시합니다.
최종 사용자가 활성화 샘플 옵션을 사용하여 ./configure를 호출하면 로컬 환경 변수
$PHP_SAMPLE이 yes로 설정됩니다. PHP_SUBST()는 공유 모듈로 확장을 구축할 때 필요한 표준 autoconf의 AC_SUBST() 매크로의 PHP 수정 버전입니다. PHP_NEW_EXTENSION(sample, Sample2.c Sample3.c, $ext_shared) 마지막 매개변수는 공유 모듈을 빌드할 때에도 필요한 PHP_SUBST(SAMPLE_SHARED_LIBADD) 명령에 해당합니다. 헤더 파일C로 개발할 때 데이터 유형 정의를 외부 헤더 파일에 넣어 소스별로 격리합니다. 파일을 포함하는 것은 일반적인 관행입니다. PHP에서는 이를 요구하지 않지만 이렇게 하면 모듈이 단일 소스 파일에서 커질 때 작업을 단순화할 수 있습니다. php_sample.h 헤더 파일에 다음 내용이 시작됩니다.#ifndef PHP_SAMPLE_H /* 防止重复包含 */ #define PHP_SAMPLE_H /* 定义扩展的属性 */ #define PHP_SAMPLE_EXTNAME "sample" #define PHP_SAMPLE_EXTVER "1.0" /* 在php源码树外面构建时引入配置选项 */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* 包含php的标准头文件 */ #include "php.h" /* 定义入口点符号, Zend在加载这个模块的时候使用 */ extern zend_module_entry sample_module_entry; #define phpext_sample_ptr &sample_module_entry #endif /* PHP_SAMPLE_H */This 헤더 파일은 두 가지 주요 작업을 수행합니다. 확장이 phpize 도구(이 책에서 일반적으로 사용되는 방법)를 사용하여 빌드되면 HAVE_CONFG_H가 정의되므로 config.h가 정상적으로 포함됩니다. 컴파일되면 php.h는 PHP 소스 트리에서 포함됩니다. 이 헤더 파일에는 대부분의 PHP API에 액세스하기 위해 PHP 소스 코드에 사용되는 다른 헤더 파일이 포함됩니다. 따라서 확장자=xxx를 사용하여 이 모듈을 로드하면 dlopen 및 dlsym()을 사용하여 Zend에서 가져올 수 있습니다. 헤더 파일에는 원본 파일에서 사용될 정보를 정의하기 위한 일부 전처리도 포함됩니다. 마지막으로 만들어야 할 가장 중요한 것은 Sample.c의 간단한 소스 코드 뼈대입니다:
#include "php_sample.h" zend_module_entry sample_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_SAMPLE_EXTNAME, NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_SAMPLE_EXTVER, #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_SAMPLE ZEND_GET_MODULE(sample) #endif
위 내용은 PHP 확장을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!