博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php扩展C++版
阅读量:3636 次
发布时间:2019-05-21

本文共 1723 字,大约阅读时间需要 5 分钟。

背景:

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

解决方案:

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

环境:

php版本:5.5.26 (下载链接:)

gcc版本:4.4.6

扩展开发主要步骤:

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

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

开发步骤:

一、生成扩展框架

解压下载好的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://qxgun.baihongyu.com/

你可能感兴趣的文章
Java学习笔记
查看>>
JDBC技术(一)
查看>>
JDBC技术(三)——预防SQL注入攻击
查看>>
JDBC技术(五)——JDBC工具类
查看>>
JDBC(六)——JDBC读取数据表,将数据存入对象中,并将对象存储到集合中
查看>>
hibernate原理
查看>>
IDEA快捷键
查看>>
Struts2原理
查看>>
activemq总结
查看>>
jdk环境变量配置
查看>>
mybatis原理
查看>>
spring原理
查看>>
AOP
查看>>
JDK和JRE的区别
查看>>
zookeper正式集群搭建(非伪集群)
查看>>
linux定时备份mysql(可用)
查看>>
linux使用链接下载文件
查看>>
maven配置阿里云仓库
查看>>
idea生成mybatis实体的方法
查看>>
idea逆向工程mybatis
查看>>