cwx 发表于 2017-3-21 08:00:26

PHP扩展生成器

作者:zhanhailiang 日期:2013-02-05

第一种方法:使用PHP源码包自带的ext_skel工具。

~/public_html/php-5.3.13/ext> ./ext_skel--extname=sample11
Creating directory sample11
Creating basic files: config.m4 config.w32 .svnignore sample11.c php_sample11.h CREDITS EXPERIMENTAL tests/001.phpt sample11.php .
To use your new extension, you will have to execute the following steps:
1.$ cd ..
2.$ vi ext/sample11/config.m4
3.$ ./buildconf
4.$ ./configure ---sample11
5.$ make
6.$ ./php -f ext/sample11/sample11.php
7.$ vi ext/sample11/sample11.c
8.$ make
Repeat steps 3-6 until you are satisfied with ext/sample11/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

第二种方法:使用CodeGen_PECL。

/usr/local/services/php/bin> sudo ./pear install CodeGen_PECL
downloading CodeGen_PECL-1.1.3.tgz ...
Starting to download CodeGen_PECL-1.1.3.tgz (102,640 bytes)
........................done: 102,640 bytes
install ok: channel://pear.php.net/CodeGen_PECL-1.1.3
/usr/local/services/php/bin> sudo ln -s /usr/local/services/php/bin/pecl-gen /usr/local/bin/
~/public_html/php-5.3.13/ext> pecl-gen --extname=sample12
Strict Standards: Declaration of CodeGen_PECL_Element_Constant::docFooter() should be compatible with that of CodeGen_Element::docFooter() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Constant.php on line 341
Strict Standards: Declaration of CodeGen_PECL_Element_Resource::hCode() should be compatible with that of CodeGen_Element::hCode() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Resource.php on line 354
Strict Standards: Declaration of CodeGen_PECL_Element_Ini::docFooter() should be compatible with that of CodeGen_Element::docFooter() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Ini.php on line 443
Strict Standards: Declaration of CodeGen_PECL_Element_Logo::hCode() should be compatible with that of CodeGen_Element::hCode() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Logo.php on line 259
Strict Standards: Declaration of CodeGen_PECL_Element_Method::setCode() should be compatible with that of CodeGen_PECL_Element_Function::setCode() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Method.php on line 471
Strict Standards: Declaration of CodeGen_PECL_Element_Stream::hCode() should be compatible with that of CodeGen_Element::hCode() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Stream.php on line 239
Your extension has been created in directory ./sample12.
See ./sample12/README and/or ./sample12/INSTALL for further instructions.

注:报错“Strict Standards: Declaration of […] should be compatible with that of […] in […]”是因为PHP5.3.0+不允许子类方法签名与父类方法签名不匹配导致的,以上例第一个严格错误提示:

Strict Standards: Declaration of CodeGen_PECL_Element_Constant::docFooter() should be compatible with that of CodeGen_Element::docFooter() in /usr/local/services/php/lib/php/CodeGen/PECL/Element/Constant.php on line 341

如下对比CodeGen_PECL_Element_Constant和CodeGen_Element的docFooter方法的声明的差异:

/usr/local/services/php/lib/php/CodeGen> grep -Rn "class CodeGen_PECL_Element_Constant" .
./PECL/Element/Constant.php:39:class CodeGen_PECL_Element_Constant
/usr/local/services/php/lib/php/CodeGen> grep -Rn "class CodeGen_Element" .
./Element.php:33:abstract class CodeGen_Element
// ./PECL/Element/Constant.php
330   /**-
331      * Generate DocBook XML section block footer
332      *
333      * @access public
334      * @paramstringExtension name
335      * @return stringDocBook XML snippet
336      */
337   static function docFooter()
338   {
339         return "</variablelist>\n";
340   }
341 }
342
343 ?>
// ./Element.php
292   /**                                                         
293      * Generate documentation footer block for all elements of this class
294      *
295      * @access public                                             
296      * @paramstring Extension name                              
297      * @return string documentation fragment                     
298      */
299   static function docFooter($name)
300   {
301         return "";
302   }                                                            
303         
304 }   
305                                                                  
306 ?>

请直接修改php.ini:

error_reporting = E_ALL & ~E_STRICT

以上只是给出了生成PHP扩展的最简单的命令,ext_skel和pecl-gen还支持多种参数生成更加丰富的扩展,请参考相关帮助文档。

~/public_html/php-5.3.13/ext> ./ext_skel --help
~/public_html/php-5.3.13/ext> pecl-gen --help
其中,pecl-gen支持从XML中导入生成扩展的强大功能,参见文档:CodeGen_PECL
- the PHP extension generator
页: [1]
查看完整版本: PHP扩展生成器