14

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

4

3 回答 3

20

正如Remus 所说,您可以使用 Zend API 使用 C/C++ 扩展 PHP。Sara Golemon的链接教程是一个好的开始,同一作者的《扩展和嵌入 PHP 》一书更详细地介绍了该主题。

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

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

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

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

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

编辑 - 这里是如何指定 g++:

最后,同样重要的是,为了在构建扩展时选择 C++ 而不是 C 编译器/链接器,第6 个参数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 构建系统手册,参数是:

  1. 扩展名
  2. 作为扩展的一部分的所有源文件的列表。
  3. (可选)$ext_shared,在调用 PHP_ARG_WITH() 时由配置确定的值
  4. (可选)“SAPI 类”,仅对需要 CGI 或 CLI SAPI 的扩展有用。在所有其他情况下,它应该留空。
  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命令可以使这种 hack 变得不必要。

于 2009-12-27T16:33:59.497 回答
6

我在SWIG的帮助下用 C++ 编写了一个 PHP 插件。这是可行的,但可能需要一段时间才能习惯 SWIG 编译周期。您可以从PHP 的 SWIG 文档开始。

更新
正如@therefromhere 所提到的,我强烈建议您阅读《扩展和嵌入 PHP 》一书。在网上几乎找不到任何文档(至少在 2008 年末、2009 年初我做 PHP 插件时没有)。我不得不依靠这本书来做所有事情。尽管有时 Google 代码搜索有助于查找示例代码。

于 2009-07-10T21:03:07.817 回答
2

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

于 2009-07-10T17:06:11.273 回答