zoukankan      html  css  js  c++  java
  • 关于windows下基于php7.0.2下编写的第一个扩展

    网上的教程是比较多的,但是基于php7+windows的教程非常之少,通过几天的摸索及参考很多资料,终于发现如下可以运行。

    php7要求使用vc2015,同时安装sdk,我使用的是8.1的windows sdk 8.1,我用的是win10 10586,也可以装10586的


    Visual Studio 2015 社区版本

    php-sdk-binary-tools-20110915.zip (http://windows.php.net/downloads/php-sdk/下载)
    deps-7.0-vc14-x86                  (http://windows.php.net/downloads/php-sdk/下载)
    php-7.0.2                        (http://php.net/downloads.php下载)

    第一步
    解压php-sdk-binary-tools的二进制包,譬如我解压到我的D:vcmyprojectsphp-sdk文件夹中,现在的目录结构如下


    D:vcmyprojectsphp-sdk
        --bin
        --script
        --share

    然后,这个是你已经安装完成了visual studio 2015,打开VS2015开人员命令提示,注意,编译是一定要用这个进,普通的cmd不行,走了很多弯路。。。

     #进入目录
    cd D:vcmyprojectsphp-sdk
    #设置环境变量
    binphpsdk_setvars.bat
    #创建常用的php-sdk目录
    binphpsdk_buildtree.bat phpdev

    如果我们打开binphpsdk_buildtree.bat文件就会发现它只创建到VC9,没有VC14,但是我们如果开发php7版本,我们需要的是VC14,这时候我们就要把D:vcmyprojectsphp-sdkphpdevvc9复制一份到D:vcmyprojectsphp-sdkphpdevvc14,现在的目录结构如下:


    D:vcmyprojectsphp-sdkphpdev
                    --vc6
                    --vc8
                    --vc9
                    --vc14

    因为我下载的deps-7.0-vc14-x86.7z,所以我要解压deps-7.0-vc14-x86.7z到D:vcmyprojectsphp-sdkphpdevvc14x86deps文件夹下覆盖,里边都是我们需要的库文件和一些必要的工具等等。
    然后,将我们下载的php-7.0.2.tar.gz解压到D:vcmyprojectsphp-sdkphpdevvc11x86php-5.5.20文件夹中。

    很重要的 安装cygwin,我用的是最新的x86版本的,下载安装到c:cygwin,这样子不需要修改ext_skel_win32.php

    编译安装php

    回到VS2015开发人员命令提示
    #进入php源目录文件夹
    cd D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2
    buildconf
    #查看带的扩展和编译命令
    configure --help

    如果你没有安装php,现在这里就帮助到你了,可以先编译安装一下php
    configure --disable-all --enable-cli
    然后,你会看到Type 'nmake' to build PHP,然后编译
    nmake
    在D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2Release_TS文件夹下就生成了php.exe文件,环境变量中加入这个路径,好在命令行中能使用php命令。

    开发PHP的第一个扩展

    进入扩展目录,生成扩展文件夹


    cd D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2ext
    php ext_skel_win32.php --extname=raintest1

    这时候我们在D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2ext就看到了自己的目录raintest1,打开raintest1php_raintest1.h,在
    #ifdef ZTS
    #include "TSRM.h"
    #endif
    下一行写入自己的函数,譬如我定义的是test1()函数
    PHP_FUNCTION(test1);
    打开php_raintest1.c编写函数,在PHP_FUNCTION(confirm_widuuweb_compiled)下

    //新增函数的实现
    PHP_FUNCTION(test1)
    {
     char *arg = NULL;
     size_t arg_len, len;
     zend_string *strg;
     if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) {
      return;
     }
     strg = strpprintf(0, "My First ext!.", "raintest1", arg);
     RETURN_STR(strg);
    }

    然后找到PHP_FE(confirm_widuuweb_compiled, NULL),在下边注册你的函数

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

    修改D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2ext aintest1config.w32,去掉//,下面那行中间那个参数去掉,改为null,不然会死活报警,说是一个变量未定义
    ARG_ENABLE("raintest1", "enable raintest1 support", "no");

    if (PHP_RAINTEST1 != "no") {
     EXTENSION("raintest1", "raintest1.c", null, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
    }
    前边的注释,vs命令行,输入cd .. 到php-7.0.2目录中,输入下面的命令
    buildconf --force
    #查看扩展
    configure --help
    如果,有错误,大家可以打开,目录下configure.js查看,我这个出现了错误,是configure.js的4791行,
    ARG_ENABLE("raintest1", "enable raintest1 support", "no");  */
    多了一个*/的注释,去掉就可以了,然后再输入
    configure --help
    就看到了,有一行
     --enable-raintest1             enable widuuweb support
    然后配置
    configure --disable-all --enable-cli --enable-raintest1=shared
    php动态扩展

    其中--enable-raintest1=shared动态扩展,正好与静态扩展相对。
    然后输入nmake,完成后,我们在D:vcmyprojectsphp-sdkphpdevvc11x86php-7.0.2Release_TS目录下就发现了php_raintest1.dll文件,可以放到环境中测试了。
    如果你本地没有安装php环境,而是跟我一样只是编译了php,如果测试,我建议静态编译看效果
    configure --disable-all --enable-cli --enable-raintest1=static
    nmake
    然后,你可以再Release_TS目录下,输入
    php -r "echo test1('adfs');"  即可正确输出
     第一个程序就可以了

  • 相关阅读:
    代码书写过程中的一些需要培养的好习惯(持续更新)
    arm linux 移植 PHP
    arm linux 支持 wifi (wpa_supplicant)
    arm linux 移植 OpenCV
    使用FFmpeg处理视频文件:视频转码、剪切、合并、播放速调整
    视频编解码 基本概念:GOP
    arm linux 移植 python3.6
    读懂反向传播算法(bp算法)
    FFmpeg命令详解
    (转)浅谈 Linux 内核无线子系统
  • 原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/8072472.html
Copyright © 2011-2022 走看看