开发环境
- Windows 10 (可以选用其它版本系统或使用虚拟机)
- Windows SDK 6.1 + Visual Studio 2008 (VC9, PHP5.4或更早版本编译工具)
- Visual Studio 2012 (VC11, PHP5.5和PHP5.6版本编译工具)
- Visual Studio 2015 (VC14, PHP7或更高版本编译工具)
依赖工具
- 扩展目录结构生成工具: php-sdk-binary-tools-20110915.zip
- 扩展开发依赖包: deps-5.5-vc11-x86.7z
- PHP源码包 VC11 x86 Thread Safe: php-5.5.37-src.zip
- PHP预编译文件 VC11 x86 Thread Safe: php-5.5.37-nts-Win32-VC11-x86.zip
新建目录 php-ext
,将所有依赖工具解压到此目录,完成后目录结构如下.
php-ext
--deps-5.5-vc11-x86
--deps
--php-5.5.37-src
--php-5.5.37-src
--php-5.5.37-Win32-VC11-x86
--php-sdk-binary-tools-20110915
准备及检测, 编译PHP 5.5
从系统菜单中打开Developer Command Prompt for VS2012
窗口,进入php-ext
目录.
设置环境变量,每次重新打开命令窗口必须重新设置环境变量
php-sdk-binary-tools-20110915\bin\phpsdk_setvars.bat
生成目录结构
执行批处理文件php-sdk-binary-tools-20110915\bin\phpsdk_buildtree.bat
.
phpsdk_buildtree.bat php-dev
进入php-dev
目录,将目录vc9
复制并重命名为vc11
.
将deps-5.5-vc11-x86
目录下的deps
目录拷贝到vc11\x86\
下覆盖原目录.
将php-5.5.37-src
目录下的php-5.5.37-src
拷贝到vc11\x86\
下.
php-dev
--vc6
--vc8
--vc9
--vc11
--x86
--deps
--php-5.5.37-src
进入php-ext\php-dev\vc11\x86\php-5.5.37-src
目录.
检查编译环境是否完整, 生成Makefile文件
buildconf --force
显示帮助
configure --help
编译参数
configure --disable-all --enable-cli
编译
nmake
扩展开发, HelloWorld
在Developer Command Prompt for VS2012
窗口(新窗口要重新设置环境变量)作如下操作.
进入php-ext\php-dev\vc11\x86\php-5.5.37-src\ext
目录.
..\Release_TS\php ext_skel_win32.php --extname=HelloWorld
进入HelloWorld
目录.
打开php_HelloWorld.h文件,在PHP_FUNCTION(confirm_HelloWorld_compiled);
行后添加代码.
PHP_FUNCTION(SayHello); //头文件声名函数
打开php_HelloWorld.c文件,在PHP_FUNCTION(confirm_HelloWorld_compiled)
函数后添加代码.
//定义函数
PHP_FUNCTION(SayHello){
char *arg_string = NULL;
int arg_len,str_len;
char *string;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"s",&arg_string,&arg_len) == FAILURE){
return;
}
str_len = spprintf(&string,0,"Hello, your first extension %.78s is ok!",arg_string);
RETURN_STRINGL(string,str_len,0);
}
然后在PHP_FE(confirm_HelloWorld_compiled, NULL);
行后添加代码.
PHP_FE(SayHello, NULL); //注册函数
打开config.w32
文件,将下面一行前面的注释//
去掉.
// ARG_ENABLE("HelloWorld", "enable HelloWorld support", "no");
返回php-ext\php-dev\vc11\x86\php-5.5.37-src
目录,执行以下命令.
buildconf --force
configure --help
注:如果报错,打开目录下的configure.js
文件,找到如下行删掉最的注释符*/
.
ARG_ENABLE("HelloWorld", "enable HelloWorld support", "no"); */
如果没有报错或再次执行configure --help
后,检查输出是否包括如下内容.
--enable-HelloWorld enable HelloWorld support
重新配置编译参数,--enable-HelloWorld=shared
动态扩展.
执行nmake
后,会在Release_TS
目录下生成php_HelloWorld.dll
文件,可以拷贝到实际应用中测试.
configure --disable-all --enable-cli --enable-HelloWorld=shared
nmake
为了方便测试可以采用静态扩展方式进行编译,--enable-HelloWorld=static
静态扩展.
configure --disable-all --enable-cli --enable-HelloWorld=static
nmake
静态编译成功后,进入Release_TS
目录,执行以下命令测试扩展效果.
php -r "echo SayHello('HelloWorld');"
//输出: Hello, your first extension HelloWorld is ok
来源:oschina
链接:https://my.oschina.net/u/221374/blog/708381