PHP扩展开发入门
时间:2009-02-25
来源:互联网
一、PHP_FUNCTION
用户空间和扩展之间的连接通过PHP_FUNCTION来完成,
- PHP_FUNCTION(sample_hello_world)
- {
- php_printf("Hello World!\n");
- }
PHP_FUNCTION()宏和普通的c函数一样,它的定义为
#define PHP_FUNCTION(name) void zif_##name(INTERNAL_FUNCTION_PARAMETERS)
在这里,可以写为下面的代码
- void zif_sample_hello_world(zval *return_value,
- char return_value_used, zval *this_ptr TSRMLS_DC)
二、function_entry
简单的声明函数是不够的,zend引擎需要知道函数的地址以及如何将函数名字导入用户空间
- static function_entry php_sample_functions[] = {
- PHP_FE(sample_hello_world, NULL)
- { NULL, NULL, NULL }
- };
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
作者: blankyao 发布时间: 2009-02-25
作者: lxylxy888666 发布时间: 2009-02-25
作者: blankyao 发布时间: 2009-02-26
作者: londit.cn 发布时间: 2009-02-26
作者: mmcmmc 发布时间: 2009-02-26
作者: cqyd505 发布时间: 2009-02-26
建议:你应该把你zend engine在这块的编译原理简单的介绍下,然后再show你的code,这样我想会更好些?
谢谢你的建议,但是我还没学到那么深,以后肯定会把我学到的都共享给大家。
作者: blankyao 发布时间: 2009-02-26
作者: abcnic1 发布时间: 2009-02-26
作者: phpwriter 发布时间: 2009-02-26
支持一下。。
作者: jackywdx 发布时间: 2009-02-26
楼主多发些扩展及内核方面的..
正需要呢.......................
作者: aaxron 发布时间: 2009-02-27
作者: sanfe 发布时间: 2009-02-27
作者: 哈出出 发布时间: 2009-03-12
学习
作者: lanye 发布时间: 2009-03-12
作者: 哈出出 发布时间: 2009-03-13
作者: chensifeng 发布时间: 2010-08-10
为了大家测试方便,俺发个可运行版本。
sample.c
- #include "php_sample.h"
-
- /* void zif_sample_hello_world(zval *return_value,
- char return_value_used, zval *this_ptr TSRMLS_DC); */
-
- const function_entry sample_functions[] = {
- PHP_FE(sample_hello_world, NULL)
- { NULL, NULL, NULL }
- };
-
- zend_module_entry sample_module_entry = {
- #if ZEND_MODULE_API_NO >= 20010901
- STANDARD_MODULE_HEADER,
- #endif
- PHP_SAMPLE_EXTNAME,
- sample_functions,
- NULL, /* MINIT */
- NULL, /* MSHUTDOWN */
- NULL, /* RINIT */
- NULL, /* RSHUTDOWN */
- NULL, /* MINFO */
- #if ZEND_MODULE_API_NO >= 20010901
- PHP_SAMPLE_EXTVER,
- #endif
- STANDARD_MODULE_PROPERTIES
- };
-
- #ifdef COMPILE_DL_SAMPLE
- ZEND_GET_MODULE(sample)
- #endif
-
-
- PHP_FUNCTION(sample_hello_world)
- {
- php_printf("Hello World!\n");
- }
- #ifndef PHP_SAMPLE_H
- /* Prevent double inclusion */
- #define PHP_SAMPLE_H
-
- /* Define Extension Properties */
- #define PHP_SAMPLE_EXTNAME "sample"
- #define PHP_SAMPLE_EXTVER "1.0"
-
- /* Import configure options
- when building outside of
- the PHP source tree */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
-
- /* Include PHP Standard Header */
- #include "php.h"
-
- /* Define the entry point symbol
- * Zend will use when loading this module
- */
- extern zend_module_entry sample_module_entry;
- #define phpext_sample_ptr &sample_module_entry
-
- #endif /* PHP_SAMPLE_H */
-
- PHP_FUNCTION(sample_hello_world); /* For testing, remove later. */
作者: chensifeng 发布时间: 2010-08-10
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28