Windows下开发PHP扩展

早过忘川 提交于 2019-11-30 21:39:41

开发环境

  1. Windows 10 (可以选用其它版本系统或使用虚拟机)
  2. Windows SDK 6.1 + Visual Studio 2008 (VC9, PHP5.4或更早版本编译工具)
  3. Visual Studio 2012 (VC11, PHP5.5和PHP5.6版本编译工具)
  4. Visual Studio 2015 (VC14, PHP7或更高版本编译工具)

依赖工具

  1. 扩展目录结构生成工具: php-sdk-binary-tools-20110915.zip
  2. 扩展开发依赖包: deps-5.5-vc11-x86.7z
  3. PHP源码包 VC11 x86 Thread Safe: php-5.5.37-src.zip
  4. 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!