C++ 开发 PHP 7 扩展之模块入口定义
2017-09-27 00:00
239 查看
zendAPI项目不提供任何底层的功能,只是封装了
zend engine提供的功能,对上提供一个易用的编程接口。这篇文章中,我们将介绍
C++世界与
C世界交汇的地方,在这里也是
zendAPI的接口与
zend engine进行整合的地方,非常重要。
每一个
PHP扩展必须有一个描述对象,在
zendAPI中我们
zapi::lang::Extension类主要的作用主要完成这个功能。现在我们来看一个最简单的
zendAPI项目的入口文件长什么样子:
#include "zapi/ZendApi.h" extern "C" { ZAPI_DECL_EXPORT void *get_module() { static zapi::lang::Extension hellozapi("hellozapi", "1.0"); return hellozapi; } }
怎么样很简单吧,一个空的
PHP扩展就完成了,现在我们就详细解释下每行的作用。
#include "zapi/ZendApi.h"
在开发基于
zendAPI的项目时候,我们只需要包含这个头文件就可以了,在这个头文件中,我们会引入
zendAPI日常开发需要的必要的头文件,您不用自己一个一个自己去引入。
extern "C" {}
在
CPP代码与
C代码进行连接的时候我们一般会加上
extern wrapper, 因为如果不加的话
CPP编译器会对函数名称进行
name mangling,这个会导致连接的时候提示符号不存在的错误。
ZAPI_DECL_EXPORT void *get_module();
ZAPI_DECL_EXPORT表示我们扩展导出符号
get_module给其他库使用。函数
get_module这个函数非常重要,他是
zendAPI与
zend engine进行集成的入口,我们必须在这个函数中设置好我们扩展的一切,然后将扩展描述对象的指针返回。
在这里我先简单描述下
PHP加载扩展这部分的过程:
在
PHP初始化的过程中调用的函数有:(这里我们以
cli SAPI为例进行说明)
php_cli_startup
php_module_startup
php_ini_register_extensions
php_load_extension
get_module = (zend_module_entry ()(void)) DL_FETCH_SYMBOL(handle, "_get_module");
调用 get_module,获取zend_module_entry 对象指针
简单来说我们可以这样理解,在
PHP模块初始化的时候,
PHP会去读取我们在
php.ini文件中注册的扩展, 比如咱们的
hellozapi就在
php.ini注册了一行
extension=hellozapi.so。如果相关的扩展文件存在,
PHP使用
dlopen平台接口进行动态加载,成功的话, 获取
_get_module符号,然后进行调用,最终获取一个
zend_module_entry指针。
static zapi::lang::Extension hellozapi("hellozapi", "1.0");
这行代码实例化一个扩展对象,第一个参数是咱们的扩展的名称,一般需要跟在
CMake脚本中定义的项目名字保持一致,第二个参数指定扩展的版本号,这里我们定义为
1.0,这些信息我们都可以在
PHP脚本中通过反射技术获取同时也会出现在
phpinfo()函数的输出中。
特别提醒:这里的
static关键字不能去掉,去掉了我们就返回了一个悬空指针。(dangle pointer)
return hellozapi;
新手可能会有疑问,我们的
get_module明明是返回一个
void *,而我们这里返回
zapi::lang::Extension对象怎么也可以啊 ?原理很简单,因为我们的
zapi::lang::Extension定义了一个转换运算符,
C++编译器会自动进行类型转换。
到这里,我们这个空的
PHP扩展就完成了,怎么样,简单吧?休息一下我们继续。
文章使用的编程文档的引用连接
ZAPI_DECL_EXPORT 参考手册zapi::lang::Extension 参考手册
原文链接: C++ 开发 PHP 7 扩展之模块入口定义
相关文章推荐
- C++ 开发 PHP 7 扩展之定义常量
- 用 C or C++ 开发PHP扩展模块
- 用 C or C++ 开发PHP扩展模块
- windows下用c/c++开发php扩展
- PHP扩展开发之动态加载so模块与静态重编译PHP(上)
- c++开发python扩展模块:cannot open file ‘python25_d.lib’解决办法
- 用C/C++制作php的扩展模块(详细版)
- LINUX下PHP扩展模块的开发和测试(原创)
- PHP扩展开发-06-变量的定义和使用
- 在 windows 下 用C++ 开发 PHP 扩展
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 开发PHP扩展模块
- NodeJS开发c++扩展模块
- Linux下php扩展模块开发
- PHP Extension组件开发完整实例(C/C++扩展PHP)
- Linux-FreeBSD下用C语言开发PHP的so扩展模块例解
- Ubuntu下C++开发PHP开发扩展的注意事项
- Linux下php扩展模块开发
- Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
- 在 windows 下 用C++ 开发 PHP 扩展