谈谈如何在PHP中加入自己的函数库(二)
时间:2007-02-17 来源:PHP爱好者
>>第二章 快速在PHP中加入自己的模块
Step 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 810 请朋友们多给我提意见,很快我会写好下章和大家交流。相关文件请在首页下载。 http://jillfox.top263.net/
欢迎与我交流 [email protected] 下几张内容
第三章 PHP扩展模块结构 第四章 走近PHP用户函数定义 第五章 数据类型及其转化 第六章 复杂数据类型的处理
很快将会推出 【本文版权归原作者analyst及奥索网共同拥有。如需转载,请注明原作者及出处】
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
Step 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 810 请朋友们多给我提意见,很快我会写好下章和大家交流。相关文件请在首页下载。 http://jillfox.top263.net/
欢迎与我交流 [email protected] 下几张内容
第三章 PHP扩展模块结构 第四章 走近PHP用户函数定义 第五章 数据类型及其转化 第六章 复杂数据类型的处理
很快将会推出 【本文版权归原作者analyst及奥索网共同拥有。如需转载,请注明原作者及出处】
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +