程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 使用C語言來擴展PHP,寫PHP擴展dll

使用C語言來擴展PHP,寫PHP擴展dll

編輯:關於PHP編程

 

 以前寫過一次PHP擴展DLL,那個是利用調用系統的COM口實現的擴展,與PHP不能真正融合。心血來潮,研究了一下PHP的源碼,網上找了一些資料,自己嘗試寫了一個擴展DLL,測試沒問題。下面記錄一下具體擴展方法:

  1、首先從www.php.net網站上下載php源碼,此處以php-5.2.17版本為例,下載後解壓至E:盤根目錄下(目錄可以自己隨意定)。

  2、下載安裝VC++ 6.0,因為PHP源碼是利用6.0版本寫的,所以使用這個版本編譯不會出現意外,別的版本未測試。

  3、把VC++ 6.0安裝目錄中的 Microsoft Visual Studio\Common\MSDev98\Bin 絕對路徑添加到系統環境變量中。

  4、進入E:\php-5.2.17\ext目錄,復制skeleton文件夾,並重命名為要開發擴展的名字,本例為“myfun”。

  5、重命名skeleton.c為myfun.c,skeleton.dsp為myfun.dsp

  6、編輯myfun目錄中的php_skeleton.h、myfun.c、myfun.dsp這三個文件,替換內容中所有extname為myfun,EXTNAME為MYFUN。(一定要嚴格區分大小寫)

  下面就進入到編碼階段:

  7、打開php_skeleton.h文件(頭文件),找到PHP_FUNCTION(confirm_myfun_compiled);,在PHP_FUNCTION(confirm_myfun_compiled);,下面編寫PHP_FUNCTION(mb_MessageBox);,聲明一個mb_MessageBox函數,此函數的作用僅是輸出js彈出一個alert消息框,用於測試。

  8、下面定義函數入口,打開myfun.c文件,找到PHP_FE(confirm_myfun_compiled,NULL) ;,在下面編寫 PHP_FE(mb_MessageBox,NULL),此處注意一下,PHP_FE是定義的一個宏,所以後面不用加引號。

  9、在myfun.c最後面編寫函數的實體部分:

	

PHP_FUNCTION(mb_MessageBox)

{

    char *arg = NULL;

    int arg_len, len;

    char *strg;

 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

        return;

    }

 

    len = spprintf(&strg, 0, "<script>alert('%s')</script>",arg); //此處正是輸入的js代碼

    RETURN_STRINGL(strg, len, 0);

}

  到這代碼書寫就完成了,下面開始編譯:

 

  10、開始->運行,輸入CMD,打開命令行窗口。

 

  11、進入myfun的目錄,輸入msdev myfun.dsp /MAKE "myfun - Win32 Release_TS",回車編譯。

 

  12、如果沒有錯誤,在E:\php-5.2.17下會生成一個Release_TS文件夾,在裡面就可以找到php_myfun.dll文件。

 

  至此擴展dll開發完成,下面在php中進行測試:

 

  13、把php_myfun.dll復制到原php目錄中的ext文件夾內。

 

  14、打開php.ini文件,添加當前dll的擴展extension=php_myfun.dll

 

  15、重啟IIS或apache,在網站目錄下新建一文件,輸入以下內容:

 

<?php

echo mb_MessageBox("測試PHP擴展DLL by 馬犇");

?>

	

  浏覽即可看到效果,下面附圖四張:

  添加擴展:

\

  php代碼:

\

  最終效果:

\

  phpinfo中的擴展信息:

  

\

 

  至此,php擴展開發已經完成

 

作者 馬犇

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved