如何编写PHP拓展

作者: vins | 来源:发表于2019-07-08 17:12 被阅读6次
    为什么要用C扩展

    C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。
    另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。

    准备工作:
    1. lnmp环境
    2. 对应的php版本源码(https://www.php.net/downloads.php)
    第一步

    在/usr/local/ 下面建立一个空白目录 PhpSourceCode 存放php源码


    第二步

    进入源码目录 cd /usr/local/PhpSourceCode/php-5.6.40/ext/
    执行命令:./ext_skel --extname=myext 出现下面则表示成功
    cd myext 可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。

    image.png
    第三步:修改config.m4
    image.png

    修改为:


    image.png
    第四步:

    修改php_myext.h文件: 添加以下两行代码 (del 为注释)

    1. PHP_FUNCTION(confirm_myext_compiled);
    2. PHP_FUNCTION(myext_helloworld);


      image.png
    第五步

    修改myext.c文件 这的代码是将函数指针注册到Zend引擎,


    image.png

    在myext.c 末尾加上

    PHP_FUNCTION(myext_helloworld)
    {
        char *arg = NULL;
        int arg_len, len;
        char *strg;
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
            return;
        }
        php_printf("Hello World!\n");
        //RETRUN_TRUE;
    }
    zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX是用来返回给PHP数据。
    
    第六步:开始编译啦 在myext目录下依次执行:
    1. /usr/local/php/bin/phpize
    2. ./configure --with-php-config=/usr/local/php/bin/php-config
    3. make
    4. make test
    5. 然后修改php.ini加入extension=myext.so 重启服务应用
    image.png

    ok 完成编写....

    相关文章

      网友评论

        本文标题:如何编写PHP拓展

        本文链接:https://www.haomeiwen.com/subject/cpxahctx.html