PHP扩展的基本结构

1、下载php源码

git clone https://github.com/php/php-src.git

 2,创建扩展

cd php-src/ext/
./ext_skel --extname=php_hello

 3、修改config.m4

PHP_ARG_ENABLE(php_hello, whether to enable php_hello support,
    Make sure that the comment is aligned:
[  --enable-php_hello           Enable php_hello support])
if test "$PHP_PHP_HELLO" != "no"; then
    PHP_NEW_EXTENSION(php_hello, php_hello.c, $ext_shared)
fi

这样一个基本的扩展就好了

4、Zend函数块入口

vim ./zend_API.h +35
typedef struct _zend_function_entry {
        const char *fname;
        void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
        const struct _zend_arg_info *arg_info;
        zend_uint num_args;
        zend_uint flags;
} zend_function_entry;

fname 函数名
handler 处理接口函数的指针
_zend_arg_info 函数参数

const zend_function_entry hello_functions[] = {
        PHP_FE(confirm_hello_compiled,  NULL)           /* For testing, remove later. */
        PHP_FE_END      /* Must be the last line in hello_functions[] */
};

 5、Zend模块扩展结构

typedef struct _zend_module_entry zend_module_entry;
struct _zend_module_entry {
        unsigned short size;
        unsigned int zend_api;
        unsigned char zend_debug;
        unsigned char zts;
        const struct _zend_ini_entry *ini_entry;
        const struct _zend_module_dep *deps;
        const char *name;
        const struct _zend_function_entry *functions;
        int (*module_startup_func)(INIT_FUNC_ARGS);
        int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
        int (*request_startup_func)(INIT_FUNC_ARGS);
        int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
        void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
        const char *version;
        size_t globals_size;
#ifdef ZTS
        ts_rsrc_id* globals_id_ptr;
#else
        void* globals_ptr;
#endif
        void (*globals_ctor)(void *global TSRMLS_DC);
        void (*globals_dtor)(void *global TSRMLS_DC);
        int (*post_deactivate_func)(void);
        int module_started;
		  unsigned char type;
        void *handle;
        int module_number;
        const char *build_id;
};

扩展中

/* {{{ hello_module_entry
 */
zend_module_entry hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
        STANDARD_MODULE_HEADER,
#endif
        "hello",
        hello_functions,
        PHP_MINIT(hello),
        PHP_MSHUTDOWN(hello),
        PHP_RINIT(hello),               /* Replace with NULL if there‘s nothing to do at request start */
        PHP_RSHUTDOWN(hello),   /* Replace with NULL if there‘s nothing to do at request end */
        PHP_MINFO(hello),
#if ZEND_MODULE_API_NO >= 20010901
        PHP_HELLO_VERSION,
#endif
        STANDARD_MODULE_PROPERTIES
};
/* }}} */

 6、运行过程

#define PHP_MINIT_FUNCTION              ZEND_MODULE_STARTUP_D
#define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D
#define PHP_RINIT_FUNCTION              ZEND_MODULE_ACTIVATE_D
#define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D
#define PHP_MINFO_FUNCTION              ZEND_MODULE_INFO_D
#define PHP_GINIT_FUNCTION              ZEND_GINIT_FUNCTION
#define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION

#define PHP_MODULE_GLOBALS              ZEND_MODULE_GLOBALS

解释

PHP_MINIT_FUNCTION  初始化module时运行
PHP_MSHUTDOWN_FUNCTION  当module被卸载时运行
PHP_RINIT_FUNCTION  当一个REQUEST请求初始化时运行
PHP_RSHUTDOWN_FUNCTION  当一个REQUEST请求结束时运行
PHP_MINFO_FUNCTION  这个是设置phpinfo中这个模块的信息
PHP_GINIT_FUNCTION  初始化全局变量时
PHP_GSHUTDOWN_FUNCTION  释放全局变量时
时间: 2024-08-10 00:04:59

PHP扩展的基本结构的相关文章

firefox扩展开发(一) : 扩展的基本结构

用过firefox的人肯定要安装firefox的扩展,这样才能发挥火狐的全部实力.一般扩展是一个后缀为.xpi的文件,其实这个文件就是zip格式的压缩包,压缩了一个扩展所需要的所有目录和文件,基本的目录结构如下: extension.xpi:/install.rdf /components/* /components/cmdline.js /defaults//defaults/preferences/*.js /plugins/* /chrome.manifest /chrome/icons/

#WEB安全基础 : HTTP协议 | 0x10 扩展HTTP报文结构概念和内容编码

#以后的知识都是HTTP协议的扩展,如果精力有限可以选择暂时忽略,注意只是暂时忽略,以后的东西同样重要 HTTP传输数据时可以直接传输也可以对数据进行编码,由于编码在计算机内运行,所以会占用一些CPU资源 报文(message):HTTP通信的基本单位,由八位组字节(由八个bit组成的一字节)流组成通过HTTP通信传输 实体(entity):作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成 HTTP报文的主体用于传输请求和下响应的实体主体.通常,报文主体等于实体主体,只有当传输

magento结构解析

Magento 模块 模块( module )是 Magento 的核心.站点上的任何一个动作( action ),无论是在前台和还是在后台的每一个操作都是通过模块来实现的.模块是可以视为一个容器,它可包含下面这几项:设置 (settings) ,数据库模式 (database schema) ,呈现对象 (rendering object) ,辅助工具类 (utility helpers) ,数据模型 (data models) 或动作控制器 (action controller) .一个模块

面向接口可扩展框架之“Mvc扩展框架及DI”

面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注

详解Google-ProtoBuf中结构化数据的编码

原文转自:http://www.wuzesheng.com/?p=1258 本文的主要内容是google protobuf中序列化数据时用到的编码规则,但是,介绍具体的编码规则之前,我觉得有必要先简单介绍一下google protobuf.因此,本文首先会介绍一些google protobuf相关的内容,让读者朋友对google protobuf有一个初步的印象,然后,再开始进入正题—-深入浅出地介绍google protobuf中用到的编码规则.下面言归正传,开始今天的话题. 1. Googl

进击的雨燕-------------类和结构体

类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意通常一个类的实例被称为对象.然而在 Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我

基于SNMP的MIB扩展方法研究

文章较长,此文章背景:毕业设计,直接去搜索我的毕业设计选题,当时还傻傻的用百度,在百度文库和CSDN等下载了很多论文.搜索到的论文有以下几种: 1)完全胡扯,听说MIB“树状”模型,直接就有写ta用二叉树实现了,恩,我上次用了Java和氧化还原反应成功拿到抓到外星人,你信不信? 2)介绍了很多知识背景,然后一下子ta们就实现了,他们做了什么工作很少涉及. 3)有位盆友一直写自己在做这件事情,ta也说网上有很多方法,但是没有有价值的方法,ta决定实现一个,但是,ta再也没有更新ta的博客.o(╯□

Swift语言的扩展与协议(接口)

/* 类型转换 1.没有任何关系的两个类型之间的转换 2.继承链条里的向上与向下转型 */ //第一种形式 let i = 3 let str = "\(i)" let str2 = String(i) //第二种形式 class Parent { var p = 1 } class Child:Parent { var c = 2 } //as是用来转换的 let c: Parent = Child() let cc = c as? Child cc?.c if let ccc =

类型转换,接口和扩展

1.没有任何关系两个类型之间的转换 let i = 3 let str = "\(i)" //插值法 let str2 = String(i) //强制转换 2.继承链条里的向上与向下转型 class Parent{ var p = 1 } class Child: Parent { var c = 2 } let pins: Parent = Child() //这时要访问子类的c就要判断了 let cins = pins as? Child //返回的是Optional cins?