回覆列表
  • 1 # 灬亦凡

    tep 1 =>

    php的擴充套件模組都放在 ext/ 目錄下,比如說 snmp模組、mysql模組。 我們要建立自己的模組,就要在ext目錄下為自己的模組建一個目錄。比如,我們要做一個分析config檔案的模組,命名為pconfig模組(parse config的簡寫),需在ext下建立目錄pconfig。將我寫好的7個檔案copy到該目錄下,另外需對主目錄下的configure和internal_functions.c作一些修改。

    Step 2 =>

    Makefile.am Makefile.in

    是模板檔案,使用者執行configure時,會呼叫這兩個檔案,生成編譯時所用的Makefile檔案。修改時將小寫的pconfig換成你自己的模組名,別忘了把大寫的PCONFIG也替換掉(不要告訴我你不會vi的替換語句)。config.m4也是執行configure將會呼叫的檢測指令碼程式,以後我們來討論這些指令碼程式的更深入的修改。現在你只需要把pconfig該成你的模組就可以了。對config.h.stub和setup.stub也如法炮製。其實setup.stub也沒什麼用。

    Step 3 =>

    php3-pconfig.h 標頭檔案中

    extern php3_module_entry pconfig_module_entry;

    #define pconfig_module_ptr &pconfig_module_entry

    #define phpext_pconfig_ptr pconfig_module_ptr

    這幾行定義了模組的入口,將入口註冊到php後,php會透過模組入口找到你寫的函式

    下面幾個函式定義是用宏進行定義的,展開以後其實就是 php3_minit_pconfig , php3_rinit_pconfig ……分別在你的模組初試化或結束時被呼叫,如果你的模組很簡單,也就不需要這些定義了

    extern PHP_MINIT_FUNCTION(pconfig);

    extern PHP_RINIT_FUNCTION(pconfig);

    extern PHP_MSHUTDOWN_FUNCTION(pconfig);

    PHP_MINFO_FUNCTION(pconfig);

    這是你的函式宣告,將來寫在php指令碼語句中的函式名就是在PHP_FUNCTION中定義的名字。

    PHP_FUNCTION(pconfig_test);

    如果有多個,還可以繼續往下加

    PHP_FUNCTION(pconfig_parsefile);

    PHP_FUNCTION(pconfig_release); …….

    Step 4 =>

    接下來我們看最重點的C程式碼了

    function_entry pconfig_functions[] = {

    PHP_FE(pconfig_test, NULL)

    {NULL, NULL, NULL}

    };

    php3_module_entry pconfig_module_entry = {

    "pconfig", pconfig_functions, PHP_MINIT(pconfig), PHP_MSHUTDOWN(pconfig), PHP_RINIT(pconfig), NULL, PHP_MINFO(pconfig), STANDARD_MODULE_PROPERTIES

    };

    註冊模組的入口資訊,比如模組名,函式介面,初試化模組將呼叫的函式等等,如果你的模組不執行復雜操作的話,可以忽略掉他們,寫成

    php3_module_entry pconfig_module_entry = {

    "pconfig", pconfig_functions, NULL,NULL,NULL,NULL,NULL,STANDARD_MODULE_PROPERTIES

    };

    Step 5 =>

    寫你自己的函式

    在標頭檔案和function_entry處,我們已經定義了自己的函式pconfig_test,現在我們就來實現pconfig_test的功能。就比如執行兩個數相加的和吧。

    static void _php3_pconfig_test(INTERNAL_FUNCTION_PARAMETERS)

    { ......

    }

    PHP_FUNCTION(pconfig_test)

    {

    _php3_pconfig_test(INTERNAL_FUNCTION_PARAM_PASSTHRU);

    }

    當系統呼叫pconfig_test時,會呼叫你的_php3_pconfig_test函式,當然你也可以把_php3_pconfig_test裡的內容直接寫在PHP_FUNCTION(pconfig_test)中,這樣做只是程式結構比較清晰。注意:不要將_php3_pconfig_test命名成php3_pconfig_test,PHP_FUNCTION(pconfig_test)宏展開後實際上就是php3_pconfig_test!

    Step 6 =>

    好了,現在我們開始修改configure,在echo $ac_n "checking for MySQL support""... $ac_c" 1>&6的前面(當然,如果你熟悉configure的話,可以加在任何合適的地方)加上下面幾句話

    if test "${with_pconfig+set}" = set; then

    withval="$with_pconfig"

    # Add your lib in here

    EXTRA_LIBS="$EXTRA_LIBS"

    # Add your include path in here

    INCLUDES="$INCLUDES"

    EXT_SUBDIRS="$EXT_SUBDIRS pconfig"

    EXT_LIBS="$EXT_LIBS pconfig/libphpext_pconfig.a"

    EXTINFO_DEPS="$EXTINFO_DEPS ../ext/pconfig/extinfo.c.stub"

    EXT_STATIC="$EXT_STATIC pconfig"

    fi

    修改internal_functions.c,在標頭檔案定義中加入#include "ext/pconfig/php3_pconfig.h"

    在zend_module_entry陣列中加入phpext_pconfig_ptr,

    Step 7 =>

    從新configure,帶上需要的引數,不要忘記的是在引數里加入 --with-pconfig

    Step 8 =>

    index.php3

    <? echo pconfig_test(123,678)."

    "; ?>

    執行%>php index.php3

  • 中秋節和大豐收的關聯?
  • 選股公式,主圖劃線公式改輸出公式?