仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1354|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:浅谈PHP Extension的开辟――基本篇第1...

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:41:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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表格。无参数。

因为函数实在是太多了,慢慢的你就会知道,知道有这个函数就可以。
沙发
发表于 2015-2-4 05:59:11 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
活着的死人 该用户已被删除
板凳
发表于 2015-2-4 08:31:18 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
精灵巫婆 该用户已被删除
地板
发表于 2015-2-27 20:12:08 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
简单生活 该用户已被删除
5#
 楼主| 发表于 2015-3-9 12:41:03 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
爱飞 该用户已被删除
6#
发表于 2015-3-16 21:57:59 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
乐观 该用户已被删除
7#
发表于 2015-3-22 00:22:04 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
山那边是海 该用户已被删除
8#
发表于 2015-3-26 23:19:15 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
飘飘悠悠 该用户已被删除
9#
发表于 2015-4-23 03:52:02 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
分手快乐 该用户已被删除
10#
发表于 2015-4-24 05:09:26 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
小妖女 该用户已被删除
11#
发表于 2015-4-26 18:56:28 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
若天明 该用户已被删除
12#
发表于 2015-5-1 20:29:02 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
若相依 该用户已被删除
13#
发表于 2015-5-3 11:05:43 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
再见西城 该用户已被删除
14#
发表于 2015-5-12 11:50:00 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
莫相离 该用户已被删除
15#
发表于 2015-6-9 22:09:09 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
老尸 该用户已被删除
16#
发表于 2015-6-18 14:39:00 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
深爱那片海 该用户已被删除
17#
发表于 2015-6-23 02:04:26 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
透明 该用户已被删除
18#
发表于 2015-6-27 02:05:09 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
冷月葬花魂 该用户已被删除
19#
发表于 2015-7-9 08:08:59 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
因胸联盟 该用户已被删除
20#
发表于 2015-7-9 21:11:41 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-11 17:09

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表