1. 如何写php扩展 PHP取得成功的一个主要原因之一是她拥有大量的可用扩展 。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到 。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展 。
扩展API的引入使PHP3取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展 。现在,两个版本过去了,API仍然和PHP3时的非常相似 。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API 。
有两个理由需要自己编写PHP扩展 。第一个理由是:PHP需要支持一项她还未支持的技术 。这通常包括包裹一些现成的C函数库,以便提供PHP接口 。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库 。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话) 。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑 。
如果以上的两个理由都和你没什么关系,同时你感觉自己没有冒险精神,那么你可以跳过本章 。
本章教你如何编写相对简单的PHP扩展,使用一部分扩展API函数 。对于大多数打算开发自定义PHP扩展开发者而言,它含概了足够的资料 。学习一门编程课程的最好方法之一就是动手做一些极其简单的例子,这些例子正是本章的线索 。一旦你明白了基础的东西,你就可以在互联网上通过阅读文挡、原代码或参加邮件列表新闻组讨论来丰富自己 。因此,本章集中在让你如何开始的话题 。在UNIX下一个叫ext_skel的脚本被用于建立扩展的骨架,骨架信息从一个描述扩展接口的定义文件中取得 。因此你需要利用UNIX来建立一个骨架 。Windows开发者可以使用Windows ext_skel_win32.php代替ext_skel 。
然而,本章关于用你开发的扩展编译PHP的指导仅涉及UNIX编译系统 。本章中所有的对API的解释与UNIX和Windows下开发的扩展都有联系 。
2. 如何编写一个PHP的C扩展 一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13#> cd /software/php-5.2.13/ext二、假设我们要开发一个名为caleng_module的扩展,该扩展包含两个函数:a--处理两个整型相加和b-处理字符串重复输出;1、首先编写一个函数定义文件,该文件编写函数原型后缀为def,假设为:caleng_module.defint a(int x, int y)string b(string str, int n)2、通过扩展骨架生成器,将在ext目录下自动建立扩展目录caleng_module#> ./ext_skel --extname=caleng_module --proto=caleng_module.def3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_module/config.m4,将如下行的注释标签"dnl"去掉,修改后如下所示:PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,Make sure that the comment is aligned:[ --enable-myfunctions Enable myfunctions support])4、完善函数a和b的功能: #> vim /software/php-5.2.13/ext/caleng_module/caleng_module.cPHP_FUNCTION(a){int x, y, z;int argc = ZEND_NUM_ARGS();if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)return;z = x + y;RETURN_LONG(z);}PHP_FUNCTION(b){char *str = NULL;int argc = ZEND_NUM_ARGS();int str_len;long n;char *result;char *ptr;int result_length;if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)return;result_length = str_len * n;result = (char *) emalloc(result_length + 1);ptr = result;while (n--) {memcpy(ptr, str, str_len);ptr += str_len;}*ptr = '\0';RETURN_STRINGL(result, result_length, 0);}三、编译安装,假设php的安装目录为:/usr/localhost/webserver/php#> cd /software/php-5.2.13/ext/caleng_module#> /usr/localhost/webserver/php/bin/phpize#> ./configure --with-php-config=/usr/localhost/webserver/php/bin/php-config#> make#> make install现在将在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目录下生成caleng_module.so文件在php.ini配置文件中加入: extension=caleng_module.so.搞定收工 。