用C++扩展PHP - (1)

原创 2004年06月11日 16:22:00

version 0.1.0<?xml:namespace prefix = o />

作者:J Smith  <dark_panda#hushmail.com> <jay#php.net>  6-May-2004

翻译:fishchen  <fishchen@mail.china.com>                10-Jun-2004

原文地址:http://bugs.tutorbuddy.com/php5cpp/php5cpp/

 

这个文档简单介绍了怎么使用C++为PHP编写一个扩展模块。我已经被问及这个问题无数次了,所以我决定为后来者写一个简单的HOWTO。这篇文章只会说明一些要点和关键之处,如果你希望学习C++或PHP,请查阅其它的文档。

顺便,在本文中我们也会看一下在PHP5中怎么把C++类影射到PHP中。文章中的例子可以在PHP4和PHP5的环境下使用,但是有一个小小的问题:扩展的PHP类只能在PHP5中使用。:P

基本上,我们会介绍怎么样为C++类创建一个可以在PHP4和PHP5下使用的结构化接口,及可以在PHP5下使用的对象化接口。

这个HOWTO是参考了一些实现得很好的PHP5扩展模块后写成的。如:Sqlite和SimpleXML扩展就是教导大家怎样在PHP5中扩展类的很好例子。但我的那些作品除外,只有cryptopp-php使用了很多特性。(还没有发布的PHP5将可以支持cryptopp-php 0.0.14。)

注意:PHP5目前仍在预发布状态,它可能还会做一些改动,尽管文档中的代码我已经在最新CVS版本的PHP 5环境下测试过,但在你读到这篇文章的时候可能还要做一些改动才能正常工作。如果文档中的代码在最新PHP 5中不能使用,请知会我,我会做相应的修正。

 1节. 开始之前

开始前,我要说明:这篇文章所描述的主要是在UNIX的PHP环境上的。当然,我会提及一些在Windows上的开发。但是我大部分的编码都是在UNIX系统上的,所以我会更多的介绍一下我所了解的那一部分。

另外一点我要说明的是:文中所介绍的方法在PHP 4.3.x和PHP 5下都是可行的。尽管我们在开始的时候会基于PHP5来介绍,但是你会发现这些方法在PHP 4.3.x中也是可行的。

我在本文中有一些约定...

$PHP_HOME 是指你的PHP源代码的位置,如:你解开的PHP源代码包所放的位置。在我的系统中指的是:/home/jay/setup/php/php-x.x.x.

我们用来做例子的模块叫做php5cpp.

 

 2节.安装

在你用C++编写PHP扩展前,你先要搭建一个基本的扩展模块的架构。在UNIX下,你可以运行一个在 $PHP_HOME/ext 下叫做ext_skel shell脚本。先切换到 $PHP_HOME/ext 目录和执行那个shell脚本,并用 --extname 参数为你的扩展模块命名。

jay@monty ~ $ cd setup/php/php-5.x.x/ext

jay@month ext $ ./ext_skel --extname php5cpp

Windows系统,目前PHP CVS代码中,可以使用位于 $PHP_HOME/extext_skel_win32.php 的PHP脚本是。也许它会成为PHP5的一部分及被PHP 4.x的分支包含。但这只是我大胆的猜想,我并不知道会不会实现...

这样,在$PHP_HOME/ext/php5cpp下,我们已经有了一个基本的PHP扩展模块架构。唯一的问题是,它是为C搭建的,而不是为C++。

 3节.修改config.m4

现在我们要修改那个扩展模块的config.m4 文件以支持C++。

你不需要做太多的改动,要做的只是告诉编译PHP的系统,你的模块是使用C++的,而且需要连接C++标准库。下边是一个删去自动生成的注释后,php5cpp 扩展模块的config.m4文件的例子:

PHP_ARG_ENABLE(php5cpp, for php5cpp support,

[ --enable-php5cpp            Enable php5cpp support])

 

if test "$PHP_php5cpp" != "no" ; then

    PHP_REQUIRE_CXX()

    PHP_NEW_EXTENSION(php5cpp, php5cpp.cpp, $ext_shared)

fi

注意其中的PHP_REQUIRE_CXX(),和php5cpp.c 已经变成了 php5cpp.cpp 了。

 4节.编写代码

修改完config.m4 后,你可以编写代码了。记住把php5cpp.c 修改成C++文件的名字。根据前边 config.m4的修改,在这里我们把它改成 php5cpp.cpp.

现在你可以开始编写你的代码了。但是你如果现在编译这个扩展代码的话,可能会生一个so,并且不会产生任何编译错误,但是并不能在PHP中使用。如果你把它静态编译进PHP,则会产生连接错误。这是因为C和C++的变量空间的不一致引起的 (PHP是使用C来编写,你的扩展使用C++来编写) 。

修改的方法就是,你要告诉你的扩展模块,将把一些PHP API函数当成C函数来对待(他们是用C来写的),而不是当成C++。

你需要把一些代码用 BEGIN/END_EXTERN_C()包起来。你的php5cpp.cpp 可能要写成像下边的样子:

extern "C" {

#include "php.h"

#include "php_ini.h"

#include "ext/standard/info.h"

}

.

.

.

#ifdef COMPILE_DL_PHP5CPP

BEGIN_EXTERN_C()

ZEND_GET_MODULE(php5cpp)

END_EXTERN_C()

#endif

一般地,我们是用 BEGIN/END_EXTERN_C() 来包起头文件的那些内容,如对 ZEND_GET_MODULE(php5cpp)那样。但是在引用声明 BEGIN/END_EXTERN_C()zend.h文件前,可以通过使用extern "C" 来达到相同的作用。

Windows系统,可以使用Visual C++编译你的扩展模块。这也需要在的扩展模块的头部加上类似的声明:

#ifdef PHP_WIN32

#include

#include

#endif

这样你可以使得你的代码保持跨平台的特性。

 5节.编译扩展模块

现在可以去编译扩展模块了。如果你想把它编译成静态模块(把它做为PHP的一个部分编译进PHP中去),去到PHP的根目录$PHP_HOME,删去 configure 文件和运行buildconf (译:需要libtool的支持)。

然后用你平常用的参数运行 configure 并加上--enable-php5cpp 项。运行 make clean, make, make install ,并完成其它的一些必要操作,如:重新编译Apache。

如果你想用动态链接库的方式编译扩展模块,到你的模块的目录下,运行phpize 命令(假设你已经安装了PEAR),它会为你的模块创建一个 configure 脚本。然后运行configure, makemake install。如果你想让你的模块自动加载,你要修改php.ini 以加载正确的文件。如:加上类似的一行:extension=php5cpp.so

现在你的PHP扩展模块已经编译好了。试着运行一下在模块目录下自动生成的php5cpp.php ,看看是不是一切正常?:)

(待续)

 

为PHP开发C++扩展

摘要 有时候,单纯依靠 PHP “本身”是不行的。尽管普通用户很少遇到这种情况,但一些专业性的应用则经常需要将 PHP 的性能发挥到极致(这里的性能是指速度或功能)。由于受到 PHP 语言本身的限制...
  • W1552332103
  • W1552332103
  • 2014年09月12日 10:56
  • 10207

为PHP开发C++扩展

http://blog.csdn.net/w1552332103/article/details/39227147 摘要 有时候,单纯依靠 PHP “本身”是不行的。尽管普...
  • ztguang
  • ztguang
  • 2016年02月01日 00:00
  • 496

c++ 写 php 扩展

http://blog.sina.com.cn/s/blog_532f78a40100qqnr.html 此篇文章准备分2个部分来讲述:    第一部分主要详细讲述一下怎么构建一个完成的C...
  • loongwong2011
  • loongwong2011
  • 2016年09月14日 09:06
  • 608

Windows下php扩展开发c++动态库

PHP扩展开发,从零了解到初步完成一个小项目,经过三天的仔细研究,现整理如下 一、需求介绍 PHP扩展开发,调用自己之前的c++动态库,完成功能 二、项目之前 系统:windows xp  开发工具:...
  • u013472838
  • u013472838
  • 2016年07月21日 18:00
  • 1601

使用C语言来扩展PHP,写PHP扩展dll

以前写过一次PHP扩展DLL,那个是利用调用系统的COM口实现的扩展,与PHP不能真正融合。心血来潮,研究了一下PHP的源码,网上找了一些资料,自己尝试写了一个扩展DLL,测试没问题。下面记录一下具体...
  • earbao
  • earbao
  • 2016年12月02日 16:08
  • 451

将PHP C++扩展从php5升级到php7

在没有怎么看明白php5 php7源码的情况下,接手一份基于php5写c++扩展,如何接手快速升级到php7环境下也能使用呢;我仅仅修改了所引用的一个php中对象处理的头文件,就满足了要求,扩展被编译...
  • zhangtaolmq
  • zhangtaolmq
  • 2017年01月09日 10:38
  • 802

php的扩展和嵌入--c++类的扩展开发

今天花了几乎一天的时间研究php的相关c++扩展,第一次接触的时候很多地方不太熟悉,也碰到了不少坑,这里把整个过程叙述如下,参考的文章主要是http://devzone.zend.com/1435/w...
  • cedricliang
  • cedricliang
  • 2013年12月17日 19:51
  • 3344

用C/C++扩展你的PHP

http://www.laruence.com/2009/04/28/719.html 简 介 英文版下载: PHP 5 Power Programming PHP取得成功...
  • loongwong2011
  • loongwong2011
  • 2016年09月16日 14:08
  • 364

Linux下调用C++源码写PHP扩展

想必有些PHP小伙伴对于写扩展很是头疼,拿我来说吧,完全不懂C++语法,却扔几个C++文件,强行要我去linux下强行编译一个C++静态/动态库(他们C++端也仅仅在windows下测试通过了罢了),...
  • baozoumingren
  • baozoumingren
  • 2017年07月22日 15:24
  • 465

在Windows下用C扩展PHP(打包成dll)的方法

1、目的 为了在php中使用C语言的扩展,本文介绍一种将C扩展打包成dll文件,提供给php调用的方法 2、需要安装的软件 (1)wamp server:其中包含php,本文中php版本为5.5....
  • maverick1990
  • maverick1990
  • 2015年06月16日 19:27
  • 3637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++扩展PHP - (1)
举报原因:
原因补充:

(最多只允许输入30个字)