zoukankan      html  css  js  c++  java
  • WINDOWS开发PHP7扩展

    最近在做个项目,需要用到唯一ID的生成,原本在Java和Delphi中,做了一个生成20位字符串(160bit)形式的唯一ID的算法,但是对比GUID(128bit),除了看起来比他短之外,其他并无优势。所以考虑重新采用Twitter-Snowflake的算法,做一个64bit的唯一ID生成。

    但是在纯PHP语言环境中,维护序列号是个麻烦的问题,所以考虑写php扩展,用C在底层实现支持。

    好了,现在这里割了,进入正题。。。

    =============================

    软件环境:

    1、Windows7 x64;

    2、安装cygwin,我选择的是下载在线的安装包,离线包个头太大,然后在线安装的时候,选择国内的源就可以了,速度还是非常快的。

    下载地址:https://cygwin.com/install.html;

    2、PHP 7.1。

    开发工具:

    php7开始,官方是使用vc14编译的,所以从避免给自己找麻烦的角度,还是下了个vs2015的社区版(这个免费哦,而且非团队开发的话,用起来基本没啥差别),

    下载地址:https://www.visualstudio.com/zh-hans/downloads/

    事先准备:

    1、php-sdk-binary-tools-20110915,sdk工具包,还有个更早点的版本,不知道有啥区别,下了最新的。

    2、deps-7.1-vc14-x64,php编译的依赖包。
    下载地址:http://windows.php.net/downloads/php-sdk/

    3、php-7.1.2-src,php对应版本的源码,这个看自己需求咯。

    下载地址:http://windows.php.net/downloads/releases/

    好了,万事具备,开工吧。

    解压php-sdk-binary-tools-20110915,然后打开VS的开发人员命令提示,要编译64位的,记得开x64版本

    进入解压后文件夹的bin目录,执行以下语句:

    phpsdk_setvars.bat //载入环境变量
    phpsdk_buildtree.bat extdev //生成开发目录(其实没啥用,喜欢按部就班的可以生成完了自己改名)

    新建一个vc14文件夹,将deps包中解压的文件放入该文件夹,若是生成的目录的话,覆盖其中的deps文件夹即可,最后再将源码包解压到当前目录。

    接下来进入源码目录:

    cd E:PHPextdevvc14x64php-7.1.2-src

    首先修改ext目录下的ext_skel_win32.php,将其中的$cygwin_path设置为你当前cygwin安装目录的bin目录

    执行该php文件

    cd ext
    php ext_skel_win32.php --extname=extname

    如果出错,根据提示查看环境配置问题,这个不再这里多说。

    正常情况执行完毕后,会生成一个extname的文件夹。(extname可以自己随意定义)

    进入该文件夹,修改一下config.w32文件,去掉下面这行的注释

    //ARG_ENABLE("extname", "enable extname support", "no");

    回到src目录下,执行下列命令:

    buildconf --force //编译配置文件
    configure --help  //检查配置文件

    如果报错的话,打开目录下的configure.js文件,找到

    ARG_ENABLE("extname", "enable extname support", "no"); */

    删除掉生成错误的注释符即可。

    在未报错的情况下,执行configure --help后,检查输出中,是否包括自定义的ext信息,显示如下:

    --enable-extname           enable extname support

    如果有,则执行如下命令进行编译

    configure --disable-all --enable-cli --enable-extname=shared
    nmake

    编译完成后,会在Release_TS或者x64Release_TS中,生成php_extname.dll。

    按照常规配置方式,将dll放入php的ext目录中,php.ini中加上extension=php_extname.dll后,便可以直接测试dll中的默认方法,方法源码如下:

    /* Remove the following function when you have successfully modified config.m4
       so that your module can be compiled into PHP, it exists only for testing
       purposes. */
    
    /* Every user-visible function in PHP should document itself in the source */
    /* {{{ proto string confirm_extname_compiled(string arg)
       Return a string to confirm that the module is compiled in */
    PHP_FUNCTION(confirm_extname_compiled)
    {
        char *arg = NULL;
        size_t arg_len;
        zend_string *strg;
    
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) {
            return;
        }
    
        strg = strpprintf(0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg);
    
        RETURN_STR(strg);
    }

    执行方式:

    php -r "echo confirm_extname_compiled(0);"
  • 相关阅读:
    使用MyEclipse可视化开发Hibernate实例
    Query查询
    Java Filter过滤机制详解(转载)
    持久化对象的状态转换
    经典SQL语句大全
    持久对象的生命周期
    Mysql命令操作
    hibernate常用的接口和类的方法以及持久化对象的状态变化
    mysql的安装
    Visual C# 2008+SQL Server 2005 数据库与网络开发 10.8 小结
  • 原文地址:https://www.cnblogs.com/rayz/p/6522804.html
Copyright © 2011-2022 走看看