使用C++扩展PHP?

14

我有一个写在PHP中的性能密集型例程,我想将其转换为C++以提高性能。是否有一种方法可以使用C++编写插件或扩展程序,然后从PHP与之进行交互?而且不需要手动编辑实际的PHP源代码。


值得注意的是,这里有一个非常类似的问题:https://dev59.com/XbixzYgBFxS5KdRj311b - John Carter
3个回答

20

正如Remus所说,你可以使用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编译器/链接器的参数应为"yes",也就是 PHP_NEW_EXTENSION()第6个参数。即:

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,一个由configure在调用PHP_ARG_WITH()时确定的值
  4. (可选) "SAPI class",仅适用于需要特定CGI或CLI SAPI的扩展。 在所有其他情况下都应该为空。
  5. (可选) 一系列要添加到CFLAGS中的标志。
  6. (可选) 一个布尔值,如果为"yes",将强制使用$CXX而不是$CC来构建整个扩展。

我无法找出如何让configure脚本将g++设置为编译器/链接器,而不是gcc,因此最终在我的bash构建脚本中使用sed命令在Makefile中进行了搜索替换:

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
注意,以这种方式设置编译器标志是一种不好的做法。这将使使用不同的编译器变得不可能。要么让它依赖于编译器,要么让用户自己选择。该选项可用于常见选项,如-D。此外,-Wall和-Werror很可能会出现问题——PHP是用C语言编写的,在某些情况下,C++比较严格,因此您可能会在PHP头文件中失败。我们在5.4中解决了许多这些问题,但仍可能出现一些C++警告。 - johannes
@johannes 好的,这个项目只是内部使用,所以对我来说不是问题。 - John Carter
如果有一天你转换到不同的平台或编译器,这可能会成为一个问题。例如,clang现在变得越来越流行。而我主要是为了未来的开发人员访问此页面而添加的 :-) - johannes

6
我用SWIG的帮助,用C++编写了一个PHP插件。这是可行的,但可能需要一段时间来适应SWIG编译周期。您可以从SWIG docs for PHP开始。 更新
正如@therefromhere所提到的那样,我强烈建议您获取扩展和嵌入PHP这本书。几乎找不到在线文档(至少在2008年末、2009年初时没有),我不得不依靠这本书来完成所有工作。虽然有时Google Code Search有助于查找示例代码。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接