我有一个写在PHP中的性能密集型例程,我想将其转换为C++以提高性能。是否有一种方法可以使用C++编写插件或扩展程序,然后从PHP与之进行交互?而且不需要手动编辑实际的PHP源代码。
我有一个写在PHP中的性能密集型例程,我想将其转换为C++以提高性能。是否有一种方法可以使用C++编写插件或扩展程序,然后从PHP与之进行交互?而且不需要手动编辑实际的PHP源代码。
正如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
])
最后,但并非最不重要的一点,在构建扩展时选择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构建系统手册,参数如下:
$ext_shared
,一个由configure在调用PHP_ARG_WITH()时确定的值我无法找出如何让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变得不必要。