最近在做个项目,需要用到唯一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:\PHP\extdev\vc14\x64\php-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或者x64\Release_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(, "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);"

WINDOWS开发PHP7扩展的更多相关文章

  1. windows下php7安装redis扩展

    windows下php7安装redis扩展windows下开发用的wamp集成的环境,想装个php-redis扩展.php_redis.dll下载地址:https://pecl.php.net/pac ...

  2. 转:Windows下PHP7安装Redis和Redis扩展phpredis

    原文地址:Windows下PHP7安装Redis和Redis扩展phpredis Windows下PHP7安装Redis和Redis扩展phpredis 2016-06-08 17:53:00 标签: ...

  3. windows下开发PHP扩展dll(无需Cygwin)

    windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...

  4. windows下memcache扩展安装和搭建

    ### windows下memcache扩展安装和搭建 背景:在做微信公众号的开发时,token的有效期为7200秒,所以需要对token进行保存,在这选择了memcache作为缓存工具 memcac ...

  5. 【逆向知识】开发WinDBG扩展DLL

    如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...

  6. windows的各种扩展名详解

    Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名.这样就可以根据文件的扩展名,判定文件的种类,从而知道其 ...

  7. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单   手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...

  8. Sublime Text 前端开发常用扩展插件推荐

    Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...

  9. 【windows开发实现记事本程序——逻辑篇1】

    1. 主要内容 从本节开始介绍windows开发实现记事本程序的逻辑实现部分.本节的主要内容有以下3点: 1. 主窗口定义  -- 主要介绍记事本主界面窗口对应的窗口类及实现方案 2. RichEdi ...

随机推荐

  1. 2017.12.22 Java序列化中你不知道的事(一)

    Java 序列化简介 Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Jav ...

  2. codeforces 1114C

    题目连接 : https://codeforces.com/contest/1114/problem/C 题目大意:给一个整数n(1e18>=n>=0),和一个整数k(1e12>=k ...

  3. OO第四单元总结

    单元架构设计 本单元OO作业主要涉及两个过程,即先根据输入的elements数组建立UML存储模型,而后基于这个模型实现一系列查询判断功能.汲取上单元的经验,建模过程中模型数据容器的选择依据要求实现的 ...

  4. ERR_FAILED 浏览器访问

    我是针对上一篇的问题 继续的探究  ,我百度了 看了这 https://zhidao.baidu.com/question/1175643597811783659.html 之后我就用 电脑管家进行系 ...

  5. 用@vue/cli发布npm包

    1.环境准备 安装node,npm,@vue/cli 2.初始化项目 用@vue/cli创建新项目 vue create mtest-ui 删除public,main.js,App.vue等无关文件, ...

  6. 51nod——2487小b和环

    dp[ i ][ 0 ] : 第i个位置不取 dp[ i ][ 1 ] : 第i个位置取 这样就可以得到状态转移方程: dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp ...

  7. 4396: [Usaco2015 dec]High Card Wins

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 175[Submit][Status][Discuss] Descriptio ...

  8. shell的条件判断

    .字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串 ...

  9. 【Linux】linux 机器之间 zssh, rz, sz互相传输

    服务器端安装lrzsz: sudo  yum install lrzsz 本地客户端安装lrzsz: brew install lrzsz 本地客户端安装zssh: brew install zssh ...

  10. 3 个用于数据科学的顶级 Python 库

    使用这些库把 Python 变成一个科学数据分析和建模工具. Python 的许多特性,比如开发效率.代码可读性.速度等使之成为了数据科学爱好者的首选编程语言.对于想要升级应用程序功能的数据科学家和机 ...