Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C+扩展PHP+;? 我有一个性能密集的例程,它是用PHP编写的,我想把它移植到C++中,以提高性能。有没有办法用C++编写一个插件或扩展,或者用它和PHP接口?没有手动编辑实际的PHP源代码?_Php_C++_Plugins_Php Extension - Fatal编程技术网

用C+扩展PHP+;? 我有一个性能密集的例程,它是用PHP编写的,我想把它移植到C++中,以提高性能。有没有办法用C++编写一个插件或扩展,或者用它和PHP接口?没有手动编辑实际的PHP源代码?

用C+扩展PHP+;? 我有一个性能密集的例程,它是用PHP编写的,我想把它移植到C++中,以提高性能。有没有办法用C++编写一个插件或扩展,或者用它和PHP接口?没有手动编辑实际的PHP源代码?,php,c++,plugins,php-extension,Php,C++,Plugins,Php Extension,PHP本身就是一个松散相关库的集合。请参阅教程,如何编写自己的。 < P>我在C++中编写了一个PHP插件。这是可行的,但可能需要一段时间才能适应SWIG编译周期。你可以从这个开始 更新 正如@therefromhere所提到的,我强烈建议你买这本书。在网上几乎找不到任何文档(至少在2008年末、2009年初我做PHP插件时没有)。我一切都得依靠这本书。尽管有时Google代码搜索有助于查找示例代码。As,但您可以使用Zend API使用C/C++扩展PHP。作者的链接教程是一个很好的开端,同一

PHP本身就是一个松散相关库的集合。请参阅教程,如何编写自己的。

< P>我在C++中编写了一个PHP插件。这是可行的,但可能需要一段时间才能适应SWIG编译周期。你可以从这个开始

更新
正如@therefromhere所提到的,我强烈建议你买这本书。在网上几乎找不到任何文档(至少在2008年末、2009年初我做PHP插件时没有)。我一切都得依靠这本书。尽管有时Google代码搜索有助于查找示例代码。

As,但您可以使用Zend API使用C/C++扩展PHP。作者的链接教程是一个很好的开端,同一作者的书更详细地介绍了这个主题

<>但是,值得注意的是,这两个(以及我在网上找到的几乎所有其他东西)都集中在C上,并且不真正地覆盖C++扩展的工作需要的一些调整。 <> > <代码> COMFI.M4< /Cord>文件中,需要显式链接到C++标准库:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)
<> >任何C++库在 COMFI.M4< /Cord>文件中编译检查也需要链接C++ LIB:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])
编辑-下面是如何指定g++:

最后,尤其是,在构建扩展时选择C++而不是C编译器/链接器,<强>第六参数>代码> PHPNeNeXExpUnsiple()/Cube >应该是代码>“是”< /COD>。即:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")
从中,参数为:

  • 扩展名
  • 作为扩展名一部分的所有源文件的列表
  • (可选)
    $ext\u shared
    ,调用PHP\u ARG\u WITH()时由configure确定的值
  • (可选)“SAPI类”,仅适用于特别需要CGI或CLI SAPI的扩展。在所有其他情况下,应将其留空
  • (可选)在构建扩展时要添加到CFLAGS的标志列表
  • (可选)一个布尔值,如果“是”,将强制使用$CXX而不是$CC构建整个扩展 我不知道如何让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
    
    想必有一个命令会使这种攻击变得不必要。

    值得注意的是,这里有一个非常类似的问题:用这种方式设置编译器标志是一种不好的做法。这使得不可能使用不同的编译器。要么使其依赖于编译器,要么将其提供给用户。该选项可用于常见选项,如-D。此外,很可能,WALW和Werror会制造麻烦。PHP是用C和C++编写的,在某些情况下,有点严格,所以可能会失败PHP报头。我们在5.4中解决了很多问题,但是一些C++警告可能仍然会发生。@约翰尼斯足够公平,这个项目只是内部使用,所以这对我来说不是问题。如果有一天你切换到一个不同的平台或编译器,它可能成为一个问题。例如,叮当声现在很流行。我主要是为将来的开发者添加的,点击这个页面:-)