如何使用C++开发PHP扩展(下)

上文中介绍了使用C++编写简单PHP扩展的方法,但是更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现。这时是使用静态库 libxxx.a ,还是使用 libxxx.so 呢 ?常见的做法是使用静态库 libxxx.a ,下面一步一步介绍:

1. 创建静态库

1.1 执行命令及内容如下:

[root@localhost ~]# mkdir libhello
[root@localhost ~]# cd libhello/
[root@localhost libhello]# vim hello.h 
[root@localhost libhello]# vim hello.cpp

hello.h

#include <string>
using namespace std;

string say();

hello.cpp

#include "hello.h"

string say()
{
    string str = "Hello World!!!!!";
    return str;
}
1.2 编译为 libhello.a (可参考:C++动态库和静态库

2. 使用骨架脚本生成PHP扩展 discuz(可参考:如何使用C++开发PHP扩展(上)

3. 把 hello.h,libhello.a 放到 PHP扩展文件夹中,如下:

[root@localhost ~]# cp libhello/libhello.a php-5.3.24/ext/discuz/lib
cp:是否覆盖“php-5.3.24/ext/discuz/lib/libhello.a”? y
[root@localhost ~]# cp libhello/hello.h php-5.3.24/ext/discuz/include/
cp:是否覆盖“php-5.3.24/ext/discuz/include/hello.h”? y

4. 修改 config.m4,内容如下:

dnl $Id$
dnl config.m4 for extension discuz

PHP_ARG_ENABLE(discuz, whether to enable discuz support,
Make sure that the comment is aligned:
[  --enable-discuz           Enable discuz support])

if test "$PHP_DISCUZ" != "no"; then
  PHP_REQUIRE_CXX()
  PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS)

  dnl set include path
  PHP_ADD_INCLUDE(./include)

  dnl checking libhello.a is exists or not
  AC_MSG_CHECKING([for lib/libhello.a])
  if test -f ./lib/libhello.a; then
      AC_MSG_RESULT([yes])
      PHP_ADD_LIBRARY_WITH_PATH(hello, ./lib, EXTRA_LDFLAGS)
  else
      AC_MSG_RESULT([not found])
      AC_MSG_ERROR([Plaese check  ./lib/libhello.a])
  fi

  PHP_NEW_EXTENSION(discuz, discuz.cpp, $ext_shared)
fi

5. 修改discuz.cpp

5.1 添加头文件

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_discuz.h"

#include <string>
#include "hello.h"

5.2 修改 discuz_say 函数,如下:

/* {{{ proto string discuz_say()
    */
PHP_FUNCTION(discuz_say)
{
    string str = say();
    RETURN_STRINGL(str.c_str(), str.length(), 1);
}

6. 编译扩展(可参考:编译PHP扩展的两种方式

7. 开始测试吧 

[root@localhost ~]# /usr/local/php-5.3.24/bin/php hi.php 
Hello World!!!!!

标签: 扩展

18
Jan 2014
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS 5 Comments

已有 5 条评论 »

  1. 烈曰 烈曰

    php-7.1.18/ext/discuz/lib/libhello.a: could not read symbols: Archive has no index; run ranlib to add one 我这边按照你的配置会出现这个问题, 请问怎么解决

    1. WiFeng WiFeng

      可能是 PHP 版本不同导致的,我试试PHP7下是否可行

  2. zzu_softboy zzu_softboy

    你好,我实现了一个c++开发php扩展的框架,有兴趣可以一起讨论, http://www.github.com/qcoreteam/zendapi

  3. lyn lyn

    你好,我这有一个第三方的C++动态库,按照你博客的方法去扩展,直接报template,请问有什么解决办法吗

  4. lyn lyn

    您好,我按照你的教程做动态库,为什么在编译的时候说找不到libhello.so?执行这个cp libhello/libhello.so php-5.3.24/ext/discuz/lib的时候确实要确认cp libhello/libhello.so php7/php-7.0.7/ext/discuz/lib
    cp:是否覆盖"php7/php-7.0.7/ext/discuz/lib"? y,但是在编译的时候却提示找不到libhello.so,我ls出discuz/lib下的文件确实是没有libhello.so ,我试了多次cp到lib下,都提示确认,但就是找不到

添加新评论 »

   点击刷新验证码