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

藏色散人
풀어 주다: 2023-03-14 14:30:01
앞으로
2688명이 탐색했습니다.

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

관련 라벨:
c php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!