使用C ++扩展PHP?

时间:2009-07-10 16:48:53

标签: php c++ plugins php-extension

我有一个用PHP编写的性能密集型例程,我想将其移植到C ++以提高性能。有没有办法用PHP编写插件或扩展或其他什么东西?没有手动编辑实际的PHP源代码?

3 个答案:

答案 0 :(得分:19)

作为Remus says,您可以使用Zend API使用C / C ++扩展PHP。 Sara Golemon的链接教程是一个良好的开端,同一作者的书Extending and Embedding PHP更详细地介绍了该主题。

然而,值得注意的是,这些(以及我在网上找到的其他所有内容)都集中在C上,并没有真正涵盖了使C ++扩展工作所需的一些调整。

config.m4文件中,您需要明确链接到C ++标准库:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)

config.m4文件中的任何C ++库编译检查也需要链接C ++库:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])

编辑 - 以下是如何指定g ++:

最后,并非最不重要的是,为了在构建扩展时选择C ++而不是C编译器/链接器,PHP_NEW_EXTENSION()第6个参数应为"yes"。即:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")

PHP build system manual开始,参数为:

  1. 扩展名
  2. 属于扩展程序的所有源文件的列表。
  3. (可选)$ext_shared,这是一个在调用PHP_ARG_WITH()时由configure确定的值
  4. (可选)“SAPI类”,仅对需要CGI或CLI SAPI的扩展有用。在所有其他情况下,它应该是空的。
  5. (可选)构建扩展时要添加到CFLAGS的标志列表。
  6. (可选)一个布尔值,如果为“是”,将强制使用$ CXX而不是$ CC构建整个扩展。
  7. <击> 我无法弄清楚如何让configure脚本将g ++设置为编译器/链接器而不是gcc,所以最后使用sed命令攻击Makefile以在我的bash构建脚本中执行搜索替换: < / p> <击>

    phpize
    ./configure --with-myextension
    if [ "$?" == 0 ]; then
    # Ugly hack to force use of g++ instead of gcc
    # (otherwise we'll get linking errors at runtime)
       sed -i 's/gcc/g++/g' Makefile
       make clean
       make
    fi
    

    据推测,有一个automake命令会使这个hack变得不必要。

答案 1 :(得分:6)

我在SWIG的帮助下用C ++编写了一个PHP插件。它是可行的,但可能需要一段时间才能适应SWIG编译周期。您可以从SWIG docs for PHP开始。

更新
正如@therefromhere所提到的那样,我强烈建议你得到这本书Extending and Embedding PHP。几乎没有可以在网上找到的文档(至少在2008年末,2009年初我没有使用我的PHP插件)。我不得不依赖这本书。虽然有时谷歌代码搜索有助于查找示例代码。

答案 2 :(得分:2)

PHP本身是松散相关库的集合。有关如何编写自己的教程,请参阅http://devzone.zend.com/article/1021