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