代码之家  ›  专栏  ›  技术社区  ›  ryeguy

用C++扩展PHP?

  •  12
  • ryeguy  · 技术社区  · 15 年前

    我有一个性能密集的例程,它是用PHP编写的,我想把它移植到C++中以提高性能。有没有方法可以用PHP编写一个插件或扩展,或者用C++和它的接口?不需要手动编辑实际的PHP源代码?

    3 回复  |  直到 11 年前
        1
  •  6
  •   StackedCrooked    14 年前

    我用C++编写了一个PHP插件 SWIG .它是可行的,但可能需要一段时间来适应swig编译周期。你可以从 SWIG docs for PHP .

    更新
    正如@therefrome所提到的,我强烈建议你买这本书 Extending and Embedding PHP . 在网上几乎找不到任何文档(至少在2008年末,2009年初,我做了PHP插件的时候没有)。我什么都得靠这本书。尽管有时谷歌代码搜索有助于找到示例代码。

        2
  •  19
  •   Community    7 年前

    AS Remus says 您可以使用ZeNeAPI来用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)
    

    任何C++库在 组态M4 文件还需要连接C++ LIB:

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

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

    最后,并不是最不重要的,为了在构建扩展时选择C++而不是C编译器/链接器, 第六 参数到 PHP_NEW_EXTENSION() 应该是 "yes" . IE:

    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 class”,仅适用于需要cgi或cli sapis的扩展。在其他情况下,它应该是空的。
    5. (可选)构建扩展时要添加到cflags的标志列表。
    6. (可选)一个布尔值,如果“是”,将强制使用$cxx而不是$cc构建整个扩展。

    我不知道如何让配置脚本将g++设置为编译器/链接器而不是gcc,所以最终用sed命令对makefile进行了黑客攻击,在我的bash构建脚本中执行搜索替换:

    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 命令会使这个黑客行为变得不必要。

        3
  •  2
  •   Remus Rusanu    15 年前

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