用C ++扩展PHP?
我有一个用PHP编写的性能密集型例程,我希望将其移植到C ++中以提高性能。 有没有什么办法来编写插件或扩展或使用C ++和从PHP接口? 没有手动编辑实际的PHP源代码?
我在SWIG的帮助下用C ++编写了一个PHP插件。 这是可行的,但是可能需要一段时间才能适应SWIG编译周期。 您可以从PHP的SWIG文档开始。
更新
正如@从此处提到的,我极力推荐您获得“ 扩展和embeddedPHP ”一书。 几乎没有任何文档可以在网上find(至less在2008年底,2009年初我没有使用我的PHP插件)。 我不得不依靠这本书。 尽pipe有时Google Code Search有助于查找示例代码。
Remus说 ,你可以使用Zend API用C / C ++来扩展PHP。 Sara Golemon的链接教程是一个很好的开始,同一作者的“ 扩展和embeddedPHP ”一书涵盖了更详细的主题。
但是,值得注意的是,这些(以及我在网上find的其他几乎所有东西)都集中在C上,并没有真正涵盖C ++扩展需要做的一些调整。
在config.m4
文件中,您需要明确链接到C ++标准库:
PHP_REQUIRE_CXX() PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
在config.m4
文件中的任何C ++库编译检查也需要链接C ++ lib:
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,, [ AC_MSG_ERROR([lib $LIBNAME not found.]) ],[ -lstdc++ -ldl ])
编辑 – 这里是如何指定g ++:
最后,也是最重要的一点,为了在构build扩展时selectC ++而不是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系统手册 ,参数是:
- 扩展名
- 所有属于扩展名的源文件列表。
- (可选)
$ext_shared
,当调用PHP_ARG_WITH()时,由configuration确定的值 - (可选)“SAPI类”,仅对需要CGI或CLI SAPI的扩展特别有用。 在所有其他情况下,它应该是空的。
- (可选)在构build扩展时添加到CFLAGS的标志列表。
- (可选)一个布尔值,如果“是”,将强制使用$ CXX而不是$ CC构build整个扩展。
我不能解决如何获得configuration脚本来设置g ++作为编译器/链接器,而不是gcc,所以最后用sed命令攻击了Makefile以在我的bash构build脚本中执行searchreplace:
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命令会使这个黑客不必要的。
PHP本身是一个松散相关的库的集合。 请参阅http://devzone.zend.com/article/1021了解如何编写自己的教程。;