>  기사  >  백엔드 개발  >  PHP 확장을 작성하는 방법

PHP 확장을 작성하는 방법

伊谢尔伦
伊谢尔伦원래의
2017-06-27 09:16:472719검색

모든 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()은 모듈을 정의하고 다음과 같이 사용해야 하는 모든 것을 열거합니다. 확장자 컴파일된 소스 파일의 일부입니다. 여러 파일이 필요한 경우 두 번째 매개변수에 공백을 사용하여 열거할 수 있습니다. 예:

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

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