• 基于Visual c++ 2012的php扩展开发


    1、cmd进入命令行模式,并进入php-5.6.20-src/ext源代码的ext目录下
    输入命令php ext_skel_win32.php --extname=HelloWord,执行结果如下图:

    执行后在ext目录下多了HelloWord文件夹

    文件夹中的HelloWord.dsp是Viscual C++的工程文件

    从php的安装目录中的dev文件夹下,找到php5ts.lib,复制到创建的HelloWord扩展目录下

    用Vs2012打开HelloWord.dsp工程文件,调试模式选择Release模式,

    F5启动调试,发生错误,提示如下:
    c:php-5.6.20-srczendzend_config.w32.h(25): fatal error C1083: 无法打开包括文件:“../main/config.w32.h”: No such file or directory

    说明main/config.w32.h文件缺失,网上搜索了诸多办法,均失效,或许是以前的版本有效,现在这里提供正确的解决办法:

    添加config.w32.h文件
    在php源代码文件目录里搜索config.w32.h,在C:php-5.6.20-srcwin32uild文件夹里找到config.w32.h.in,将这个文件复制到C:php-5.6.20-srcmain文件夹里,去掉后面的.in
    注意:为了让扩展能和php运行环境严格匹配,要根据你的php运行环境的编译版本(php5.6.20是VC11编译的),在config.w32.h文件里加上:
    #define PHP_COMPILER_ID "VC11"

    此时再重新编译,编译成功,在php-5.6.20-src目录下生成了Release_TS目录,里面有生成的扩展文件php_HelloWord.dll

    此时我们将php_HelloWord.dll拷贝到C:/php/ext目录下,并设置php.ini文件增加extension=php_HelloWord.dll,并重启Apache服务器
    此时我们用phpinfo()函数测试,发现已经成功安装了php_HelloWord.dll扩展

    打开HelloWord.c文件
    找到如下函数:

    PHP_FUNCTION(confirm_HelloWord_compiled)
    {
    
        char *arg = NULL;
        int arg_len, len;
        char *strg;
    
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
            return;
        }
    
        len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "HelloWord", arg);
        RETURN_STRINGL(strg, len, 0);
    }

    在下面增加函数HelloPHP

    PHP_FUNCTION(HelloPHP)
    {
            RETURN_STRING("Hello PHP Ext!", 1);
    }

    找到如下代码:

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

    并修改如下:

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

    重新编译,生成php_HelloWord.dll

    此时将php_HelloWord.dll复制到php/ext目录下,我们编写测试php代码如下:

    <?php
    echo HelloPHP();
    ?>

    可以看到执行结果:

    自此第一个简单的扩展开发完成!

  • 相关阅读:
    日志规范实践
    序列化和反序列化及Protobuf 基本使用
    简述TCP网络编程本质
    笔记:多线程服务器的适用场合(1)
    聊聊同步、异步、阻塞与非阻塞(转)
    《EntrePreneur》发刊词
    make和makefile简明基础
    luogu P3687 [ZJOI2017]仙人掌 |树形dp
    luogu P3172 [CQOI2015]选数 |容斥原理
    luogu P4513 小白逛公园 |线段树
  • 原文地址:https://www.cnblogs.com/fancing/p/6394189.html
Copyright © 2020-2023  润新知