>백엔드 개발 >PHP 문제 >PHP에서 확장 기능을 사용자 정의하는 방법 (1) 기본 단계

PHP에서 확장 기능을 사용자 정의하는 방법 (1) 기본 단계

藏色散人
藏色散人앞으로
2021-12-20 15:47:282743검색

php 사용자 정의 확장 (1)

처음 PHP 확장을 작성했을 때 Baidu에서 직접 확장을 작성했던 것으로 기억하는데, 왜 그런지는 잘 모르겠습니다. 먼저 확장의 기본 단계를 설명한 다음 그 뒤에 숨은 원칙을 논의하세요.

소스 코드 도구를 사용하여 확장 디렉터리 구조를 자동으로 생성합니다

먼저 PHP 소스 코드 ext 디렉터리를 입력하고 다음 명령을 실행합니다.

/www/test/php/php/bin/php ext_skel.php --ext helloworld
cd helloworld

config.m4 구성 파일을 수정합니다. 지금 작성한 확장 프로그램이 외부에서 사용되는지 여부입니다. 의존하려면 --with-hello 옵션을 구성하고, 그렇지 않으면 --enable-hello 옵션을 구성하고 필요에 따라 주석을 제거하세요config.m4配置文件,就是现在写的扩展是否用到外部依赖,就配置--with-hello选项,否则配置--enable-hello选项,按照自己的需求把注释去掉

dnl If your extension references something external, use 'with':
 PHP_ARG_WITH([helloworld],
   [for helloworld support],
   [AS_HELP_STRING([--with-helloworld],
     [Include helloworld support])])

dnl Otherwise use 'enable':

扩展功能书写

然后vim  helloworld.c 进行扩展功能代码书写
先看下模块结构定义

zend_module_entry helloworld_module_entry = {
        STANDARD_MODULE_HEADER,
        "helloworld",                                   /* Extension name */
        helloworld_functions,                   /* zend_function_entry */
        PHP_MINIT(helloworld),                                                  /* PHP_MINIT - Module initialization */
        NULL,                                                   /* PHP_MSHUTDOWN - Module shutdown */
        PHP_RINIT(helloworld),                  /* PHP_RINIT - Request initialization */
        NULL,                                                   /* PHP_RSHUTDOWN - Request shutdown */
        PHP_MINFO(helloworld),                  /* PHP_MINFO - Module info */
        PHP_HELLOWORLD_VERSION,         /* Version */
        PHP_MODULE_GLOBALS(pib),
    NULL,
    NULL,
    NULL,
    STANDARD_MODULE_PROPERTIES_EX
};

功能函数名字集合

static const zend_function_entry helloworld_functions[] = {
        PHP_FE(helloworld_test1,                arginfo_helloworld_test1)
        PHP_FE(helloworld_test2,                arginfo_helloworld_test2)
        PHP_FE_END
};

真正的功能函数代码

PHP_FUNCTION(helloworld_test2)
{
        int argc = ZEND_NUM_ARGS();
        char *messages = NULL;
        size_t   messages_len = 0;
        char *context = NULL;
        size_t   context_len = 0;

        zend_string *retval;

        ZEND_PARSE_PARAMETERS_START(0, 2)
                Z_PARAM_OPTIONAL
                Z_PARAM_STRING(messages, messages_len)
                Z_PARAM_STRING(context, context_len)
        ZEND_PARSE_PARAMETERS_END();

        retval = strpprintf(0, "Hello %s test %s", messages, context);

        RETURN_STR(retval);
}

函数参数定义

ZEND_BEGIN_ARG_INFO(arginfo_helloworld_test2, 0)
        ZEND_ARG_INFO(0, str)
ZEND_END_ARG_INFO()

编译安装

/www/test/php/php/bin/phpize
./configure --with-php-config=/www/test/php/php/bin/php-config
make && make install

现在PHP的扩展目录中已经有了helloworld.so这个文件,在php.ini中添加上扩展的配置

extension = helloworld.so

然后就可以测试自己写的函数了helloworld_test2() rrreee확장 함수 작성

그 다음 vim helloworld .c 확장 함수 코드 작성
먼저 모듈 구조 정의를 살펴보세요
rrreee

함수 함수 이름 모음
rrreee🎜실제 함수 함수 코드 🎜rrreee🎜함수 매개변수 정의🎜rrreee🎜🎜컴파일 및 설치🎜🎜 rrreee🎜이제 PHP 확장 디렉터리에 helloworld.so 파일이 있습니다. php.ini🎜rrreee🎜그러면 <code>helloworld_test2() 함수를 작성하여 테스트할 수 있습니다. 확장을 완료한 후에는 아무것도 얻지 못한 것 같습니다. 왜 작성했는지는 알 수 없습니다. 다음 부분에서 원리에 대해 이야기해 보겠습니다. 먼저 PHP 수명 주기부터 시작하겠습니다. 🎜다음 기사🎜를 참조하세요. 🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜🎜

위 내용은 PHP에서 확장 기능을 사용자 정의하는 방법 (1) 기본 단계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제