资讯专栏INFORMATION COLUMN

用C++开发PHP扩展

flybywind / 790人阅读

摘要:常规的扩展开发流程我再别的文章里面已经介绍过了,这里不再赘述,只介绍一下开发扩展的不同之处。剩下的代码自己用自由发挥吧。

由于PHP的底层就是C开发的,不可避免的常用PHP扩展也都是C开发的,但是有时我们想用C++来开发可以吗,答案当然是可以的,并且有它自己的优势,第一可以方便地面向对象编程,第二可以利用现有C++编译的动态链接库。

常规的PHP扩展开发流程我再别的文章里面已经介绍过了,这里不再赘述,只介绍一下C++开发PHP扩展的不同之处。

修改config.m4

利用ext_skel工具生成扩展的基础框架,默认生成的框架是针对C的,所以针对C++修改config.m4文件
config.m4文件是编译基础中最核心的文件,这个文件主要是用autoconf来产生configure配置文件,继而自动生成大家所熟悉的Makefile文件。需要注意的是,每次修改config.m4,需要phpize --clean,再重新phpize

PHP_ARG_WITH(dict, for hsdt support,
Make sure that the comment is aligned:
[  --with-demo             Include demo support])

表示demo扩展需要依赖外部动态链接库,在configure的时候 --with-demo的参数表示依赖外部动态链接库的路径,比如编译PHP时使用的--with-curl=/usr/local/libcurl表示依赖的libcurl.so的路径在/usr/local/libcurl里面

PHP_ADD_INCLUDE($DEMO_DIR/include)

表示依赖的外部动态链接库的include的头文件的路径

PHP_REQUIRE_CXX()

表示这个扩展使用C++

PHP_SUBST(DEMO_SHARED_LIBADD)

用于说明这个扩展编译成动态链接库的形式

PHP_ADD_LIBRARY(stdc++, 1, DEMO_SHARED_LIBADD)

用于将标准C++库加入扩展

PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $DICT_DIR/lib64, DICT_SHARED_LIBADD)

用于将依赖的外部动态链接库加入扩展

PHP_NEW_EXTENSION(demo, 
    xxx.cpp yyy.cpp zzz.cpp,
    $ext_shared,, 
    -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)

第2行指定哪些源文件需要编译,中间用空格间隔

修改源文件

包括.h文件和.cpp文件,因为PHP提供的ZEND API都是C编写的,所以在include的时候需要在外面加一层extern "C",目的是把一些C写的库或宏用兼容的方式给解决。剩下的代码自己用C++自由发挥吧。

extern "C" {
  #ifdef ZTS
  #include "TSRM.h"
  #endif
}
extern "C" {
  #ifdef HAVE_CONFIG_H
  #include "config.h"
  #endif
  #include "php.h"
  #include "php_ini.h"
  #include "ext/standard/info.h"
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30340.html

相关文章

  • PHP扩展开发教程1 - 相关开发技术对比及介绍

    摘要:四使用语言开发是我重点推荐的扩展开发框架,简明易懂,功能强大,开发效率高,代码易维护,执行速度快。优点三支持,的扩展开发有两套扩展开发框架,分别支持,,虽然框架代码有两个,但是接口却是一样的。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级阶段。本教程系列...

    alaege 评论0 收藏0
  • PHP扩展开发教程4 - 开发我们自己的接口类

    摘要:二扩展类的普通函数支持的样式扩展类的函数,必须按照一定的规范来写,返回值和参数的名称类型都是有规定。最常见的是下面种函数样式,跟上一章的普通函数的样式其实差不多,返回值和参数的用法也完全一样,所以就不再多说。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级...

    xiaodao 评论0 收藏0
  • C++ 开发 PHP 7 扩展之原生函数定义

    摘要:第一步打开项目下的文件,在文件中输入我们的函数的原型声明代码。这行代码注册一个原型为的函数,当这个函数被执行的时候,我们的函数将被运行时调用。原文地址开发扩展之原生函数定义 在上一篇中我们在hellozapi扩展中我们定义了几个常量,但是一个有用的扩展,必须得有函数,没有函数的扩展啥用没有,如果您觉得定义函数很难的话,您又错了,zendAPI就是为了让您生活变得美好而生的,而不会让事情...

    asce1885 评论0 收藏0
  • PHP扩展开发教程5 - 扩展函数的参数类型(1)

    摘要:前面两节介绍了如何用编写常用的扩展函数,扩展类。对怎么使用开发扩展应该已经很熟悉了,下面晋级学习一下关于扩展函数参数类型方面的内容。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级阶段。本教程系列在linux下面开发(推荐使用centos),php版本用的...

    DoINsiSt 评论0 收藏0
  • C++ 开发 PHP 7 扩展之模块入口定义

    摘要:每一个扩展必须有一个描述对象,在中我们类主要的作用主要完成这个功能。表示我们扩展导出符号给其他库使用。文章使用的编程文档的引用连接参考手册参考手册原文链接开发扩展之模块入口定义 zendAPI 项目不提供任何底层的功能,只是封装了 zend engine 提供的功能,对上提供一个易用的编程接口。这篇文章中,我们将介绍 C++ 世界与 C 世界交汇的地方,在这里也是 zendAPI 的接...

    dabai 评论0 收藏0

发表评论

0条评论

flybywind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<