zoukankan      html  css  js  c++  java
  • php扩展开发笔记(2)多个源代码文件的配置和编译

    我们在开发过程中,为了代码得可读性和易维护性,肯定是须要多个代码文件的,而不不过通过 ext_skel 生成得骨架文件。

    这篇文章主要介绍下。多个代码文件的时候。我们须要注意什么,以及怎么做。

    我的代码文件例如以下(slash为我的扩展名)

    // ext_skel 生成默认得模块相关的主要文件
    php_slash.h // 头文件
    slash.c // 源代码文件
    config.m4 // 编译的时候须要改动的文件

    在这个默认生成的骨架文件中面,我们只要运行以下几步,就能够完毕一个新的扩展了。

    删除config.m4的第1012行开头的凝视dnl
    phpize
    ./configure
    make && make install

    通过上面的步骤,我们就完毕了一个扩展,通过 dl(“slash.so”);的方式就能够进行測试了。假设编写一个类在上一篇文章里有介绍。

    以下我们介绍添加新的类和源代码文件以及怎样编译配置等。

    添加一个新的php类(Slash_Http_Util),而且给该类添加一个 getIv 的方法,php代码測试代码例如以下:

    $httpUtil = new Slash_Http_Util();
    $httpUtil->getIv(); // 会输出 HELLO

    源代码文件 slash_http_util.h

    #ifndef SLASH_HTTP_UTIL_H
    #define SLASH_HTTP_UTIL_H
    
    extern zend_class_entry *slash_http_util_ce;
    
    PHP_METHOD(slash_http_util, getIv);
    SLASH_MINIT_FUNCTION(http_util);
    #endif

    源代码文件 slash_http_util.c

    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include "php.h"
    #include "php_ini.h" /* for zend_alter_ini_entry */
    
    #include "php_slash.h"
    #include "slash_http_util.h"
    
    zend_class_entry *slash_http_util_ce;
    
    PHP_METHOD(slash_http_util, getIv) {
        php_printf("HELLO");
        RETURN_TRUE;
    }
    
    zend_function_entry slash_http_util_methods[] = {
        ZEND_ME(slash_http_util, getIv, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
        PHP_FE_END
    };
    
    SLASH_MINIT_FUNCTION(http_util) {
        zend_class_entry ce;
        SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_HTTP_UTIL, slash_http_util_methods);
        slash_http_util_ce = zend_register_internal_class(&ce TSRMLS_CC);
    
        return SUCCESS;
    }

    以上的代码完毕了新类的加入。而且给该类添加了一个叫 getIv 的方法。

    以下须要改动我的 config.m4 配置文件,添加 slash_http_util.c 这个文件。

    打开 config.m4 到最后倒数第二行。默认 ext_skel 生成的代码是

    PHP_NEW_EXTENSION(slash,slash.c,$ext_shared)

    改动,添加 slash_http_util.c 这个文件,须要注意的是两个 *.c 文件之间是空格,没有标点符号

    PHP_NEW_EXTENSION(slash,slash.c slash_http_util.c, $ext_shared)

    完毕 config.m4 的改动以后,还须要去改动 slash.c 这个文件,默认情况下在这个文件中会有以下的代码

    PHP_MINIT_FUNCTION(slash)
    {
        /* If you have INI entries, uncomment these lines
        REGISTER_INI_ENTRIES();
        */
        return SUCCESS;
    }

    我们须要把我们新创建的这个类载入进来

    PHP_MINIT_FUNCTION(slash)
    {
        /* If you have INI entries, uncomment these lines
        REGISTER_INI_ENTRIES();
        */
        SLASH_STARTUP(http_util);
        return SUCCESS;
    }

    通过这几步,新的类就全然创建成功了,你能够通过 phpize、configure、make 来编译这个模块了。最后通过我们開始制定的目标进行測试。

    几个须要注意的问题:
    1. 改动 config.m4 文件,添加源代码文件
    2. 改动 config.m4 文件以后。须要又一次运行 phpize && ./configure && make
    3. 在模块(slash.c文件)载入函数中 PHP_MINIT_FUNCTION 加入这个新的类。

    上面的代码中假设你全然copy可能没办法通过编译,由于我自己定义重命名了几个宏(php_slash.h)。实际开发中你能够zend的宏。

    #define SLASH_CN_HTTP_UTIL "Slash_Http_Util"
    
    // {{{ php life cycle redefine
    #define SLASH_MINIT_FUNCTION(module) PHP_MINIT_FUNCTION(slash_##module)
    #define SLASH_MSHUTDOWN_FUNCTION(module) PHP_MSHUTDOWN_FUNCTION(slash_##module)
    #define SLASH_RINIT_FUNCTION(module) PHP_RINIT_FUNCTION(slash_##module)
    #define SLASH_RSHUTDOWN_FUNCTION(module) PHP_RSHUTDOWN_FUNCTION(slash_##module)
    #define SLASH_STARTUP(module) PHP_MODULE_STARTUP_N(slash_##module)(INIT_FUNC_ARGS_PASSTHRU)
    // }}}
    
    // {{{ class init mac
    #define SLASH_INIT_CLASS_ENTRY(ce, name, methods)  INIT_CLASS_ENTRY(ce, name, methods)
    // }}}

    以上代码仅供參考,欢迎交流。

  • 相关阅读:
    基于对象颜色的对象检测(翻译)
    根据颜色和大小来检测和跟踪实时网络摄像机中的对象(翻译)
    C# 笔记 基础(2)
    C#学习笔记 基础 (1)
    深入学习RBAC系列模型——RBAC0模型的开发与学习心得
    RBAC权限管理
    SSL协议的工作流程
    页面的加载
    java实例化对象的方式
    cron表达式详解 原创
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7351288.html
Copyright © 2011-2022 走看看