Welcome 微信登录

首页 / 网页编程 / PHP / php的扩展自动生成

php的扩展自动生成2013-09-09扩展生成

毫无疑问你已经注意到, 每个php扩展都包含一些非常公共的并且非常单调的结构和文件. 当开始一个新扩展开发的时候, 如果这些公共的结构已经存在, 我们只用考虑填充功能代码是很有意义的. 为此, 在php中包含了一个简单但是很有用的shell脚本.

ext_skel

切换到你的php源代码树下ext/目录中, 执行下面的命令:

jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ ./ext_skel extname=sample7  

稍等便可, 输出一些文本, 你将看到下面的这些输出:

To use your new extension, you will have to execute the following steps:1.$ cd ..2.$ vi ext/sample7/config.m43.$ ./buildconf4.$ ./configure [with|enable]-sample75.$ make6.$ ./php -f ext/sample7/sample7.php7.$ vi ext/sample7/sample7.c8.$ makeRepeat steps 3-6 until you are satisfied with ext/sample7/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.
此刻观察ext/sample7目录, 你将看到在第5章"你的第一个扩展"中你编写的扩展骨架代码的注释版本. 只是现在你还不能编译它; 不过只需要对config.m4做少许修改就可以让它工作了, 这样你就可以避免第5章中你所做的大部分工作.

生成函数原型

如果你要编写一个对第三方库的包装扩展, 那么你就已经有了一个函数原型及基本行为的机器刻度版本的描述(头文件), 通过传递一个额外的参数给./ext_skel, 它将自动的扫描你的头文件并创建对应于接口的简单PHP_FUCNTION()块. 下面是使用./ext_skel指令解析zlib头:

jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ ./ext_skel extname=sample8 proto=/usr/local/include/zlib/zlib.h
现在在ext/sample8/sample8.c中, 你就可以看到许多PHP_FUNCTION()定义, 每个zlib函数对应一个. 要注意, 骨架生成程序会对某些未知资源类型产生警告消息. 你需要对这些函数特别注意, 并且为了将这些内部的复杂结构体和用户空间可访问的变量关联起来, 可能会需要使用你在第9章"资源数据类型"中学到的知识.

PECL_Gen

还有一种更加完善但也更加复杂的代码生成器: PECL_Gen, 可以在PECL(http://pecl.php.net)中找到它, 使用pear install PECL_Gen命令可以安装它.

译者注: PECL_Gen已经迁移为CodeGen_PECL(http://pear.php.net/package/CodeGen_PECL). 本章涉及代码测试使用CodeGen_PECL的版本信息为: "php 1.1.3, Copyright (c) 2003-2006 Hartmut Holzgraefe", 如果您的环境使用有问题, 请参考译序中译者的环境配置.

一旦安装完成, 它就可以像ext_skel一样运行, 接受相同的输入参数, 产生大致相同的输出, 或者如果提供了一个完整的xml定义文件, 则产生一个更加健壮和完整可编译版本的扩展. PECL_Gen并不会节省你编写扩展核心功能的时间; 而是提供一种可选的方式高效的生成扩展骨架代码.

specfile.xml

下面是最简单的扩展定义文件:

<?xml version="1.0" encoding="utf-8" ?><extension name="sample9"> <functions><function name="sample9_hello_world" role="public"> <code><![CDATA[php_printf("Hello World!"); ]]> </code></function> </functions></extension>
译注: 请注意, 译者使用的原著中第一行少了后面的问号, 导致不能使用, 加上就OK.

通过PECL_Gen命令运行这个文件:

jdoe@devbox:/home/jdoe/cvs/php-src/ext/$ pecl-gen specfile.xml  

则会产生一个名为sample9的扩展, 并暴露一个用户空间函数sample9_hello_world().

关于扩展

除了你已经熟悉的功能文件, PECL_Gen还会产生一个package.xml文件 它可以用于pear安装. 如果你计划发布包到PECL库, 或者哪怕你只是想要使用pear包系统交付内容, 有这个文件都会很有用.

总之, 你可以在PECL_Gen的specfile.xml中指定多数package.xml文件的元素.

<?xml version="1.0" encoding="UTF-8" ?><extension name="sample9"><summary>Extension 9 generated by PECL_Gen</summary><description>Another sample of PHP Extension Writing</description><maintainers><maintainer><name>John D. Bookreader</name><email>jdb@example.com</email><role>lead</role></maintainer></maintainers><release><version>0.1</version><date>2006-01-01</date><state>beta</state><notes>Initial Release</notes></release>...</extension>
当PECL_Gen创建扩展时, 这些信息将被翻译到最终的package.xml文件中.