zoukankan      html  css  js  c++  java
  • PHP扩展的基本结构

    1、下载php源码

    git clone https://github.com/php/php-src.git
    

     2,创建扩展

    cd php-src/ext/
    ./ext_skel --extname=php_hello
    

     3、修改config.m4

    PHP_ARG_ENABLE(php_hello, whether to enable php_hello support,
        Make sure that the comment is aligned:
    [  --enable-php_hello           Enable php_hello support])
    if test "$PHP_PHP_HELLO" != "no"; then
        PHP_NEW_EXTENSION(php_hello, php_hello.c, $ext_shared)
    fi
    

     这样一个基本的扩展就好了

    4、Zend函数块入口

    vim ./zend_API.h +35  
    typedef struct _zend_function_entry {
            const char *fname;
            void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
            const struct _zend_arg_info *arg_info;
            zend_uint num_args;
            zend_uint flags;
    } zend_function_entry;
    

    fname 函数名
    handler 处理接口函数的指针
    _zend_arg_info 函数参数

    const zend_function_entry hello_functions[] = {
            PHP_FE(confirm_hello_compiled,  NULL)           /* For testing, remove later. */
            PHP_FE_END      /* Must be the last line in hello_functions[] */
    };
    

     5、Zend模块扩展结构

    typedef struct _zend_module_entry zend_module_entry;
    struct _zend_module_entry {
            unsigned short size;
            unsigned int zend_api;
            unsigned char zend_debug;
            unsigned char zts;
            const struct _zend_ini_entry *ini_entry;
            const struct _zend_module_dep *deps;
            const char *name;
            const struct _zend_function_entry *functions;
            int (*module_startup_func)(INIT_FUNC_ARGS);
            int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
            int (*request_startup_func)(INIT_FUNC_ARGS);
            int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
            void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
            const char *version;
            size_t globals_size;
    #ifdef ZTS
            ts_rsrc_id* globals_id_ptr;
    #else
            void* globals_ptr;
    #endif
            void (*globals_ctor)(void *global TSRMLS_DC);
            void (*globals_dtor)(void *global TSRMLS_DC);
            int (*post_deactivate_func)(void);
            int module_started;
    		  unsigned char type;
            void *handle;
            int module_number;
            const char *build_id;
    };
    

     扩展中

    /* {{{ hello_module_entry
     */
    zend_module_entry hello_module_entry = {
    #if ZEND_MODULE_API_NO >= 20010901
            STANDARD_MODULE_HEADER,
    #endif
            "hello",
            hello_functions,
            PHP_MINIT(hello),
            PHP_MSHUTDOWN(hello),
            PHP_RINIT(hello),               /* Replace with NULL if there's nothing to do at request start */
            PHP_RSHUTDOWN(hello),   /* Replace with NULL if there's nothing to do at request end */
            PHP_MINFO(hello),
    #if ZEND_MODULE_API_NO >= 20010901
            PHP_HELLO_VERSION,
    #endif
            STANDARD_MODULE_PROPERTIES
    };
    /* }}} */
    

     6、运行过程

    #define PHP_MINIT_FUNCTION              ZEND_MODULE_STARTUP_D
    #define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D
    #define PHP_RINIT_FUNCTION              ZEND_MODULE_ACTIVATE_D
    #define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D
    #define PHP_MINFO_FUNCTION              ZEND_MODULE_INFO_D
    #define PHP_GINIT_FUNCTION              ZEND_GINIT_FUNCTION
    #define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION
    
    #define PHP_MODULE_GLOBALS              ZEND_MODULE_GLOBALS
    

     解释

    PHP_MINIT_FUNCTION  初始化module时运行  
    PHP_MSHUTDOWN_FUNCTION  当module被卸载时运行  
    PHP_RINIT_FUNCTION  当一个REQUEST请求初始化时运行  
    PHP_RSHUTDOWN_FUNCTION  当一个REQUEST请求结束时运行  
    PHP_MINFO_FUNCTION  这个是设置phpinfo中这个模块的信息  
    PHP_GINIT_FUNCTION  初始化全局变量时  
    PHP_GSHUTDOWN_FUNCTION  释放全局变量时
    
  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/chenpingzhao/p/4706158.html
Copyright © 2011-2022 走看看