您的位置:首页 > 编程语言 > C语言/C++

php扩展C++版

2016-09-10 22:01 218 查看


php扩展开发指南(C++版)

转至元数据结尾转至元数据起始


背景:

数据通路每天有几T的数据需要处理,其中最耗时间的是schema校验过程,使用php原生代码检验一条数据大概需要3~5ms,假设一条数据大小20k,1T数据有5kw条记录,使用一台机器推送1T数据需要5kw*4ms=200000s,大约2.4天,这样的传输效率远远不能满足业务需求。因此,需要进一步优化、提高性能。


解决方案:

使用C++编写schema校验模块,将其封装为php扩展,然后在php代码中直接调用接口,调研发现,性能至少可以提升30倍以上。


环境:

php版本:5.5.26 (下载链接:http://php.net/get/php-5.5.26.tar.bz2/from/a/mirror

gcc版本:4.4.6


扩展开发主要步骤:

利用php源码包生成扩展框架(skeleton)
修改配置文件(config.m4)使其支持C++
添加已编写好的C++源码
编写php接口与C++接口绑定代码
编译、调试

下面对每一步做详细介绍,并且指出自己遇到的问题,供读者参考。


开发步骤:


一、生成扩展框架

解压下载好的php源码包,假设解压后的文件目录为/home/spider/php-5.5.26,我们约定以此为工作目录(WORK_DIR),进入WORK_DIR。

首先进入ext文件夹,会发现一个叫 ext_skel 的可执行文件,第一反应使用-h参数查看该文件功能与用法介绍,命令如下:

./ext_skel -h

不出意料的话会出现如下提示:



可以看出工具很简单,只要提供新扩展的名字即可。我们的扩展取名xmlschema,使用如下命令创建:

./ext_skel --extname=xmlschema

这时会在当前目录下产生一个叫xmlschema的目录,里面就是新扩展的基本框架。如果想指定其到其它路径,可通过参数–skel指定。至此,开发php扩展第一步已经完成。看一下xmlschema目录内容:



后续开发中主要打交道的文件为:config.m4, php_xmlschema.h, xmlschema.c。


二、修改配置

ext_skel生成的框架默认支持C语言,需要稍做修改才能支持C++。其主要配置文件为config.m4,在做修改之前先简单介绍一下config.m4里面的宏命令。
dnl:单行注释符
PHP_ARG_WITH:指定PHP扩展模块的工作方式,不需要第三方库
PHP_ARG_ENABLE:指定PHP扩展模块的工作方式,需要第三方库
PHP_REQUIRE_CXX:表明此扩展使用C++编译
PHP_ADD_INCLUDE:指定扩展用到的头文件目录
PHP_ADD_LIBRARY:添加扩展用到的动态链接库
PHP_ADD_LIBRARY_WITH_PATH:添加扩展用到的动态链接库路径
PHP_CHECK_LIBRARY:指定PHP扩展模块PHP_ADD_LIBRARY_WITH_PATH定义以及库连接错误信息等
PHP_SUBST:用于说明这个扩展编译成动态链接库的形式,如 PHP_SUBST(XMLSCHEMA_SHARED_LIBADD)
PHP_NEW_EXTENSION:用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开

config.m4文件:

首先删除PHP_ARG_ENABLE前面的注释,最终可能为下图样子:



然后添加C++支持:在 if test "$PHP_XMLSCHEMA" != "no"; then 里面添加如下配置:

PHP_REQUIRE_CXX()

PHP_SUBST(XMLSCHEMA_SHARED_LIBADD)

PHP_ADD_LIBRARY(stdc++, 1, XMLSCHEMA_SHARED_LIBADD)

PHP_NEW_EXTENSION(xmlschema, xmlschema.cpp, $ext_shared)

最终的效果如下图所示:



图中所示多了几个配置项,这个根据自己的需求灵活添加即可。

xmlschema.c

因为要编译C++代码,故这里要将xmlschema.c改为xmlschema.cpp,然后将原来的include头文件用extern "C"引用进来,修改后的代码片断如下图所示:

 


参考链接:

http://php.net/manual/de/internals2.structure.php
http://php.net/manual/de/internals2.ze1.zendapi.php
https://github.com/johannes/php-notify-error/blob/master/config.m4
http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: