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.phphttp://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/
相关文章推荐
- 用C++扩展PHP - (2)
- C++编写PHP扩展
- 用c/c++写php扩展模块的杂想
- 利用C++开发PHP扩展
- linux下php实现C/C++扩展编程
- 用C++扩展PHP
- Linux下用C++开发PHP扩展
- Linux下C++实现PHP扩展中级应用(一)
- PHP扩展C++
- 用C/C++制作php的扩展模块(详细版)
- Linux下用C++作php扩展的问题
- 用C++扩展PHP
- apache + apache c++ 扩展 + mysql + php + php c++ 扩展
- 在 windows 下 用C++ 开发 PHP 扩展
- 用C++扩展PHP
- VC6 PHP C++ 扩展
- apache + apache c++ 扩展 + mysql + php + php c++ 扩展
- 用C/C++扩展你的PHP
- 用 C or C++ 开发PHP扩展模块
- 原:用C/C++扩展PHP