【问题标题】:Extending PHP with C++?用 C++ 扩展 PHP?
【发布时间】:2009-07-10 16:48:52
【问题描述】:

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

【问题讨论】:

标签: php c++ plugins php-extension


【解决方案1】:

作为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
])

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

最后,同样重要的是,为了在构建扩展时选择 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,参数为:

  1. 扩展名
  2. 作为扩展的一部分的所有源文件的列表。
  3. (可选)$ext_shared,在调用 PHP_ARG_WITH() 时由 configure 确定的值
  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 变得不必要。

【讨论】:

  • 以这种方式设置编译器标志是一种不好的做法。这使得无法使用不同的编译器。要么让它依赖于编译器,要么让它给用户。该选项可用于 -D 等常见选项。此外,-Wall 和 -Werror 很可能会造成麻烦 - PHP 是用 C 和 C++ 编写的,在某些情况下会更严格一些,因此您可能会在 PHP 标头中失败。我们在 5.4 中修复了其中的许多问题,但仍然可能会出现一些 C++ 警告。
  • @johannes 很公平,这是一个仅供内部使用的项目,所以这对我来说不是问题。
  • 如果有一天你切换到不同的平台或编译器,它可能会成为一个问题。例如,clang 这些天变得流行起来。我主要是为将来访问此页面的开发人员添加它:-)
【解决方案2】:

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

更新
正如@therefromhere 所提到的,我强烈建议您购买这本书Extending and Embedding PHP。在网上几乎找不到任何文档(至少在 2008 年末、2009 年初我做 PHP 插件时没有)。我不得不依靠这本书来做所有事情。虽然有时 Google 代码搜索有助于查找示例代码。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2014-08-11
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多