Windows下開發PHP擴展

開發環境

  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

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目錄.windows

設置環境變量,每次從新打開命令窗口必須從新設置環境變量函數

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.ui

deps-5.5-vc11-x86目錄下的deps目錄拷貝到vc11\x86\下覆蓋原目錄..net

php-5.5.37-src目錄下的php-5.5.37-src拷貝到vc11\x86\下.code

php-dev
--vc6
--vc8
--vc9
--vc11
  --x86
    --deps
    --php-5.5.37-src

進入php-ext\php-dev\vc11\x86\php-5.5.37-src目錄.ip

檢查編譯環境是否完整, 生成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
相關文章
相關標籤/搜索