|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。 摘要&引言
PHP是以后使用十分普遍的一门言语,从国外的Facebook、Twitter到国际的淘宝、腾讯、百度再到互联网上各式各样的各类大中小型网站都能见到它的身影。PHP的胜利,应当说很大水平上依附于其开放的扩大API机制和丰厚的扩大组件(PHP Extension),恰是这些扩大组件使得PHP从各类数据库操作到XML、JSON、加密、文件处置、图形处置、Socket等范畴无所不克不及。有时分开辟人员能够需求开辟本人的PHP扩大,以后PHP5的扩大机制是基于Zend API的,Zend API供应了丰厚的接口和宏界说,加上一些适用东西,使得PHP扩大开辟起来难度其实不算出格大。本文将引见关于PHP扩大组件开辟的根基常识,并经由过程一个实例展现开辟PHP扩大的根基进程。
PHP扩大组件的开辟进程在Unix和Windows情况下有所分歧,但根基是互通的,本文将基于Unix情况(详细利用Linux)。浏览本文需求复杂懂得Unix情况、PHP和C言语的一些基本常识,只需复杂懂得就行,我会尽可能不触及太甚详细的操作体系和言语特征,并在需要的中央加以注释,以便读者浏览。
本文的详细开辟情况为Ubuntu 10.04 + PHP 5.3.3。
下载PHP源代码
要开辟PHP扩大,第一步要下载PHP源代码,由于外面有开辟扩大需求的东西。我下载的是PHP最新版本5.3.3,格局为tar.bz2紧缩包。下载地址为:http://cn.php.net/get/php-5.3.3.tar.bz2/from/a/mirror。
下载后,将源代码挪动到适合的目次并解压。解压号令为:
复制代码 代码以下:tar -jxvf 源码包称号
若下载的是tar.gz紧缩包,解压号令为
复制代码 代码以下:tar -zxvf 源码包称号
解压后,在源代码目次中有个ext目次,这里即是和PHP扩大有关的目次。进入目次后用ls检查,可以看到很多已存在的扩大。下图是在我的情况下检查的了局:
个中蓝色的均是扩大包目次,个中可以看到咱们很熟习的mysql、iconv和gd等等。而ext_skel是Unix情况下用于主动生成PHP扩大框架的剧本东西,前面咱们即刻会用到,ext_skel_win32.php是windows下对应的剧本。
开辟本人的PHP扩大――say_hello
上面咱们开辟一个PHP扩大:say_hello。这个扩大很复杂,只是承受一个字符串参数,然后输入“Hello xxx!”。这个例子只是为了引见PHP扩大组件的开辟流程,不承当实践功效。
生成扩大组件框架
PHP的扩大组件开辟目次和文件是有固定组织布局的,你可以随意进入一个已有扩大组件目次,检查其一切文件,我想你必定目炫凌乱了。固然你可以选择手工完成框架的搭建,不外我信任你更但愿有甚么器材来帮你完成。上文提到的ext_skel剧本就是用来主动构建扩大包框架的东西。ext_skel的完全号令为:
ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir] [--full-xml] [--no-help]
作为初学者,咱们不用懂得一切号令参数,实践上,大多半情形下只需求供应第一个参数就能够了,也就是扩大模块的名字。因而,咱们在ext目次中键入以下号令:
./ext_skel --extname=say_hello
(假如你但愿具体懂得ext_skel的各项号令参数, 请参考这里)
这时候再用ls检查,会发明多了一个“say_hello”目次,进入这个目次,会发明ext_skel已为咱们创立好了say_hello的根基框架,以下图:
假如你懒得弄清晰PHP扩大包目次布局的全体内容,那末外面有三个文件你必需注重:
config.m4:这是Unix情况下的Build System设置装备摆设文件,前面将会经由过程它生成设置装备摆设和装置。
php_say_hello.h:这个文件是扩大模块的头文件。遵守C言语一向的风格,这个外面可以放置一些自界说的布局体、全局变量等等。
say_hello.c:这个就是扩大模块的主法式文件了,终究的扩大模块各个函数进口都在这里。固然,你可以将一切法式代码都塞到这外面,也能够遵守模块化思惟,将各个功效模块放到分歧文件中。
上面的内容次要环绕这三个文件睁开。
Unix Build System设置装备摆设
开辟PHP扩大组件的第一步不是写完成代码,而是要先设置装备摆设好Build System选项。因为咱们是在Linux下开辟,所以这里的设置装备摆设次要与config.m4有关。
关于Build System设置装备摆设这一块,如果写起来能写一大堆,并且与Unix体系良多器材相干,就算我有乐趣写估量人人也没乐趣看,所以这里咱们从略,只拣关头中央说一下,关于config.m4更多细节可以参考这里。
翻开生成的config.m4文件,内容大致以下:
复制代码 代码以下:
dnl $Id$
dnl config.m4 for extension say_hello
dnl Comments in this file start with the string "dnl".
dnl Remove where necessary. This file will not work
dnl without editing.
dnl If your extension references something external, use with:
dnl PHP_ARG_WITH(say_hello, for say_hello support,
dnl Make sure that the comment is aligned:
dnl [ --with-say_hello Include say_hello support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(say_hello, whether to enable say_hello support,
dnl Make sure that the comment is aligned:
dnl [ --enable-say_hello Enable say_hello support])
if test "$PHP_SAY_HELLO" != "no"; then
dnl Write more examples of tests here...
dnl # --with-say_hello -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
dnl SEARCH_FOR="/include/say_hello.h" # you most likely want to change this
dnl if test -r $PHP_SAY_HELLO/$SEARCH_FOR; then # path given as parameter
dnl SAY_HELLO_DIR=$PHP_SAY_HELLO
dnl else # search default path list
dnl AC_MSG_CHECKING([for say_hello files in default path])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl SAY_HELLO_DIR=$i
dnl AC_MSG_RESULT(found in $i)
dnl fi
dnl done
dnl fi
dnl
dnl if test -z "$SAY_HELLO_DIR"; then
dnl AC_MSG_RESULT([not found])
dnl AC_MSG_ERROR([Please reinstall the say_hello distribution])
dnl fi
dnl # --with-say_hello -> add include path
dnl PHP_ADD_INCLUDE($SAY_HELLO_DIR/include)
dnl # --with-say_hello -> check for lib and symbol presence
dnl LIBNAME=say_hello # you may want to change this
dnl LIBSYMBOL=say_hello # you most likely want to change this
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $SAY_HELLO_DIR/lib, SAY_HELLO_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_SAY_HELLOLIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([wrong say_hello lib version or lib not found])
dnl ],[
dnl -L$SAY_HELLO_DIR/lib -lm
dnl ])
dnl
dnl PHP_SUBST(SAY_HELLO_SHARED_LIBADD)
PHP_NEW_EXTENSION(say_hello, say_hello.c, $ext_shared)
fi
这个布局体能够看起来会让人有摇头疼,不外我仍是要注释一下外面的内容。由于这就是PHP Extension的原型,假如不弄清晰,就没法开辟PHP Extension了。固然,我就纷歧一对每一个字段停止注释了,只拣关头的、这篇文章会用到的字段说,由于很多字段其实不需求咱们手工填写,而是可使用某些预界说的宏填充。
第7个字段“name”,这个字段是此PHP Extension的名字,在本例中就是“say_hello”。
第8个字段“functions”,这个将寄存咱们在此扩大中界说的函数的援用,详细布局不再剖析,有乐趣的伴侣可以浏览_zend_function_entry的源代码。详细编写代码时这里会有响应的宏。
第9-12个字段分离是四个函数指针,这四个函数会在响应机会被挪用,分离是“扩大模块加载时”、“扩大模块卸载时”、“每一个恳求入手下手时”和“每一个恳求停止时”。这四个函数可以当作是一种拦阻机制,次要用于响应机会的资本分派、释放等相干操作。
第13个字段“info_func”也是一个函数指针,这个指针指向的函数会在履行phpinfo()时被挪用,用于显示自界说模块信息。
第14个字段“version”是模块的版本。
(关于zend_module_entry更详实的引见请参考这里)
引见完以上字段,咱们可以看看“say_hello.c”中主动生成的“say_hello_module_entry”框架代码了。
复制代码 代码以下:
/* {{{ say_hello_module_entry
*/
zend_module_entry say_hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"say_hello",
say_hello_functions,
PHP_MINIT(say_hello),
PHP_MSHUTDOWN(say_hello),
PHP_RINIT(say_hello), /* WordStr with NULL if there"s nothing to do at request start */
PHP_RSHUTDOWN(say_hello), /* WordStr with NULL if there"s nothing to do at request end */
PHP_MINFO(say_hello),
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* WordStr with version number for your extension */
#endif
STANDARD_MODULE_PROPERTIES
};
/* }}} */
起首,宏“STANDARD_MODULE_HEADER”会生成前6个字段,“STANDARD_MODULE_PROPERTIES ”会生成“version”后的字段,所以如今咱们还不必费心。而咱们关怀的几个字段,也都填写好或由宏生成好了,而且在“say_hello.c”的响应地位也生成了几个函数的框架。这里要注重,几个宏的参数均为“say_hello”,但这其实不暗示几个函数的名字全为“say_hello”,C言语中也不成能存在函数名重载机制。实践上,在开辟PHP Extension的过程当中,几近处处都要用到Zend里预界说的各类宏,从全局变量到函数的界说乃至前往值,都不克不及依照“裸写”的体例来编写C言语,这是由于PHP的运转机制能够会招致定名抵触等成绩,而这些宏会将函数等元素变换成一个外部称号,但这些对法式员都是通明的(除非你去浏览那些宏的代码),咱们经由过程各类宏停止编程,而宏则为咱们处置良多外部的器材。
写到这里,咱们的义务就了然了:第一,假如需求在响应机会处置一些器材,那末需求填充各个拦阻函数内容;第二,编写say_hello的功效函数,并将援用添加到say_hello_functions中。
编写phpinfo()回调函数
由于say_hello扩大在各个性命周期阶段其实不需求做操作,所以咱们只编写info_func的内容,上文说过,这个函数将在phpinfo()履行时被主动挪用,用于显示扩大的信息。编写这个函数会用到四个函数:
php_info_print_table_start()――入手下手phpinfo表格。无参数。
php_info_print_table_header()――输入表格头。第一个参数是整形,指明头的列数,然后前面的参数是与列数等量的(char*)类型参数用于指定显示的文字。
php_info_print_table_row()――输入表格内容。第一个参数是整形,指明这一行的列数,然后前面的参数是与列数等量的(char*)类型参数用于指定显示的文字。
<P>php_info_print_table_end()――停止phpinfo表格。无参数。
因为函数实在是太多了,慢慢的你就会知道,知道有这个函数就可以。 |
|