+ -
当前位置:首页 → 问答吧 → PHP扩展开发入门

PHP扩展开发入门

时间:2009-02-25

来源:互联网

关于如何着手开发一个PHP扩展,大家可以去看下黑夜路人同学写的快速开发一个PHP扩展一文,这篇文章深入浅出的介绍了开发一个PHP扩展的基本流程,今天我就来总结下PHP扩展开发里面几个基本的宏和函数。

   一、PHP_FUNCTION
用户空间和扩展之间的连接通过PHP_FUNCTION来完成,
  1. PHP_FUNCTION(sample_hello_world)
  2. {
  3.      php_printf("Hello World!\n");
  4. }
复制代码

PHP_FUNCTION()宏和普通的c函数一样,它的定义为
#define PHP_FUNCTION(name)  void zif_##name(INTERNAL_FUNCTION_PARAMETERS)
在这里,可以写为下面的代码

  1. void zif_sample_hello_world(zval *return_value,
  2.      char return_value_used, zval *this_ptr TSRMLS_DC)
复制代码

二、function_entry
简单的声明函数是不够的,zend引擎需要知道函数的地址以及如何将函数名字导入用户空间

  1.   static function_entry php_sample_functions[] = {
  2.      PHP_FE(sample_hello_world,        NULL)
  3.      { NULL, NULL, NULL }
  4. };
复制代码


php_sample_functions向量要随着你向扩展中添加函数而增长,每一个函数都会是这个向量中的一部分。
考虑PHP_FE()宏,PHP_FE(sample_hello_world,        NULL)展开后会是{ "sample_hello_world", zif_sample_hello_world, NULL},
这样既提供了函数的名字,同时提供了指向它的实现函数的指针,地三个参数暗示一些信息比如某个特定的参数要以引用的方式传递。

三、zend_module_entry
现在已经有了对外的函数,但是还没有和zend引擎联系起来。你只要将function_entry类型的结构加入zend_module_entry这个类型的结构就可以了。

只会这些是不够的,你还需要了解一些PHP内核的机制,以及Zend Engine的机制。另外很重要的一点是,你需要有扎实的C语言基础,网上关于PHP扩展以及内核机制的内容不太多,大多数都是英文的,推荐大家阅读下Sams.Extending.and.Embedding.PHP.一书,也是英文的。

今天就先介绍这点,不足之处,欢迎大家指教!

[ 本帖最后由 blankyao 于 2009-2-26 14:13 编辑 ]

作者: blankyao   发布时间: 2009-02-25

看来这方面的文章很不受欢迎啊:mad:

作者: blankyao   发布时间: 2009-02-25

前段时间看了这方面的,破电脑装不上LIN,,,,

作者: lxylxy888666   发布时间: 2009-02-25

看来大家对这方面的东西真的不感兴趣啊

作者: blankyao   发布时间: 2009-02-26

我顶楼主!

作者: londit.cn   发布时间: 2009-02-26

还没到这个境界,看不太懂

作者: mmcmmc   发布时间: 2009-02-26

建议:你应该把你zend engine在这块的编译原理简单的介绍下,然后再show你的code,这样我想会更好些?

作者: cqyd505   发布时间: 2009-02-26

原帖由 cqyd505 于 2009-2-26 13:17 发表
建议:你应该把你zend engine在这块的编译原理简单的介绍下,然后再show你的code,这样我想会更好些?


谢谢你的建议,但是我还没学到那么深,以后肯定会把我学到的都共享给大家。

作者: blankyao   发布时间: 2009-02-26

我支持你 :)不是很懂

作者: abcnic1   发布时间: 2009-02-26

顶一下:handshake:

作者: phpwriter   发布时间: 2009-02-26

:biggrin:
支持一下。。

作者: jackywdx   发布时间: 2009-02-26

强.
楼主多发些扩展及内核方面的..
正需要呢.......................

作者: aaxron   发布时间: 2009-02-27

支持下,多学学!

作者: sanfe   发布时间: 2009-02-27

楼主能不能更新一下教程,来点细的,带图,在WIN下操作~:funk:

作者: 哈出出   发布时间: 2009-03-12

tukiz14
学习

作者: lanye   发布时间: 2009-03-12

强烈建议楼主做的详细一点,还有一些需要注意的细节和问题,楼主的方法老是失败ING

作者: 哈出出   发布时间: 2009-03-13

建议大家在转载文章前先自己试验下,断章取义的引用容易误人子弟。

作者: chensifeng   发布时间: 2010-08-10



为了大家测试方便,俺发个可运行版本。
sample.c
  1. #include "php_sample.h"

  2. /* void zif_sample_hello_world(zval *return_value,
  3.      char return_value_used, zval *this_ptr TSRMLS_DC); */

  4. const function_entry sample_functions[] = {
  5.      PHP_FE(sample_hello_world,        NULL)
  6.      { NULL, NULL, NULL }
  7. };

  8. zend_module_entry sample_module_entry = {
  9. #if ZEND_MODULE_API_NO >= 20010901
  10.         STANDARD_MODULE_HEADER,
  11. #endif
  12.         PHP_SAMPLE_EXTNAME,
  13.         sample_functions,
  14.         NULL, /* MINIT */
  15.         NULL, /* MSHUTDOWN */
  16.         NULL, /* RINIT */
  17.         NULL, /* RSHUTDOWN */
  18.         NULL, /* MINFO */
  19. #if ZEND_MODULE_API_NO >= 20010901
  20.         PHP_SAMPLE_EXTVER,
  21. #endif
  22.         STANDARD_MODULE_PROPERTIES
  23. };

  24. #ifdef COMPILE_DL_SAMPLE
  25. ZEND_GET_MODULE(sample)
  26. #endif


  27. PHP_FUNCTION(sample_hello_world)
  28. {
  29.         php_printf("Hello World!\n");
  30. }
复制代码
php_sample.h
  1. #ifndef PHP_SAMPLE_H
  2. /* Prevent double inclusion */
  3. #define PHP_SAMPLE_H

  4. /* Define Extension Properties */
  5. #define PHP_SAMPLE_EXTNAME        "sample"
  6. #define PHP_SAMPLE_EXTVER        "1.0"

  7. /*         Import configure options
  8.         when building outside of
  9.         the PHP source tree  */
  10. #ifdef HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif

  13. /* Include PHP Standard Header */
  14. #include "php.h"

  15. /* Define the entry point symbol
  16. * Zend will use when loading this module
  17. */
  18. extern zend_module_entry sample_module_entry;
  19. #define phpext_sample_ptr &sample_module_entry

  20. #endif /* PHP_SAMPLE_H */

  21. PHP_FUNCTION(sample_hello_world);        /* For testing, remove later. */
复制代码

作者: chensifeng   发布时间: 2010-08-10