【发布时间】:2009-07-10 16:48:52
【问题描述】:
我有一个用 PHP 编写的性能密集型例程,我想将它移植到 C++ 以提高性能。有没有办法使用 C++ 编写插件或扩展或其他东西并从 PHP 与它交互?无需手动编辑实际的 PHP 源代码?
【问题讨论】:
-
值得注意的是这里有一个非常相似的问题:stackoverflow.com/questions/492014/…
标签: php c++ plugins php-extension
我有一个用 PHP 编写的性能密集型例程,我想将它移植到 C++ 以提高性能。有没有办法使用 C++ 编写插件或扩展或其他东西并从 PHP 与它交互?无需手动编辑实际的 PHP 源代码?
【问题讨论】:
标签: php c++ plugins php-extension
作为Remus says,您可以使用 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 编译器/链接器,PHP_NEW_EXTENSION() 的 6th 参数应该是 "yes"。即:
PHP_NEW_EXTENSION(your_extension,
your_extension.cpp,
$ext_shared,
,
"-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
"yes")
来自PHP build system manual,参数为:
$ext_shared,在调用 PHP_ARG_WITH() 时由 configure 确定的值我不知道如何让配置脚本将 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 变得不必要。
【讨论】:
在SWIG 的帮助下,我用 C++ 编写了一个 PHP 插件。这是可行的,但可能需要一段时间才能习惯 SWIG 编译周期。你可以从SWIG docs for PHP开始。
更新
正如@therefromhere 所提到的,我强烈建议您购买这本书Extending and Embedding PHP。在网上几乎找不到任何文档(至少在 2008 年末、2009 年初我做 PHP 插件时没有)。我不得不依靠这本书来做所有事情。虽然有时 Google 代码搜索有助于查找示例代码。
【讨论】:
PHP 本身就是一组松散相关的库。有关如何编写自己的教程,请参阅 http://devzone.zend.com/article/1021。
【讨论】: