最近在做个项目,需要用到唯一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. codeforce 599C Day at the Beach

    Bi表示第i个块,那么就是说Bi max ≤ Bi+1 min,又因为Bi min ≤ Bi max, 因此只要判断前缀的最大值是否小于等于后缀. #include<bits/stdc++.h& ...

  2. ifup/ifdown ethX 和 ifconfig ehtX up/down的区别

    相同点:[启用]和[禁止]网卡 ifup  ethX 和 ifconfig  ethX  up               用来启用网卡设备 ifdown  ethX 和 ifconfig  ethX ...

  3. Java源码——HashMap的源码分析及原理学习记录

    学习HashMap时,需要带着这几个问题去,会有很大的收获: 一.什么是哈希表 二.HashMap实现原理 三.为何HashMap的数组长度一定是2的次幂? 四.重写equals方法需同时重写hash ...

  4. shiro学习记录(一)

    1 权限概述 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么?? 2 常见 ...

  5. Apache服务器的安装和配置

    启动 Apache,让别人可以使用你机器上安装的 Apache 提供的 Web 服务,访问你机器上的网站.这种情况下你的机器就是服务器,别人的机器就是客户端 appsevApache服务器的基本安装 ...

  6. split 分割压缩文件

    1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...

  7. django-redis缓存记录

    对于站点缓存,我们使用redis这款key-value数据库.Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的 ...

  8. JDBC的连接mySql的基本知识

    这只是我自己的随笔博客~,用于偶尔回忆知识,可能存在一些错误,如有错误,欢迎指正~ 首先对于JDBC连接MySQL,要了解基本的框架结构 画的比较烂,大约就是这样的结构 然后看一下具体实现的 代码:: ...

  9. Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本

    Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...

  10. selinux详解及配置文件

    selinux详解 selinux 的全称是Security Enhance Linux,就是安全加强的Linux.在Selinux之前root账号能够任意的访问所有文档和服务 : 如果某个文件设为7 ...