将 PHP 与本地 C++ 程序链接

Posted

技术标签:

【中文标题】将 PHP 与本地 C++ 程序链接【英文标题】:Linking PHP with local C++ program 【发布时间】:2012-01-28 03:57:38 【问题描述】:

我已经研究了几个小时,但我所看到的一切似乎都令人生畏。到目前为止,我一直在使用 php 来处理我网站上的所有简单内容。我正在做大量的统计工作,我希望 C++ 可用于更密集的计算。

c++ 将在与 PHP 相同的 Unix 机器上本地运行。

以下是我不知道该怎么做的事情:

<?php 
//c++ program has a counter initialized to 0
//PHP tells c++ to add 5 to the counter.  $incremented is 5
$incremented = increment_in_cpp_and_return(5);
//$incremented_again will be 7
$incremented_again = increment_in_cpp_and_return(2);
?>

当然,我正在运行一些蒙特卡罗模拟并遍历非常大的树而不是递增数字,但这并不是阻碍我前进的原因。

C++ 只需要监听一个数字并返回另一个数字(最多可能是 JSON 中的一些东西)。对于 c++ 来说,在调用之间跟踪其变量很重要。

我已经阅读了大量有关 TCP、套接字编程等方面的知识,但我有点怀疑这是否像示例所显示的那样复杂。很多事情都把我指向了这个https://beej.us/guide/bgnet/html/multi/clientserver.html#simpleserver

如果真的是100多行c++,有没有一些流行的库,或者有没有其他语言的简单实现?

谢谢!

【问题讨论】:

@therefromhere:完成:***.com/a/8639563/367456 我对 c++ 如何在调用之间保持其状态有点困惑。 proc_open 可以用来通过 STDIN 传递给持续运行的 c++ 程序吗?我担心它会启动一个新的 c++ 实例... 在下面查看我的回答和评论... 【参考方案1】:

如果您只想从 PHP 访问您的 C++ 程序(或使用 PHP 作为 C++ 代码的 Web 前端),通过套接字进行通信的替代方法是将 C++ 代码作为扩展嵌入到 PHP 中。

有相当多的样板代码与之相关,但其中大部分是由ext_skel 脚本为您生成的(包含在 PHP 源代码中)。

大多数关于编写 PHP 扩展的在线信息都与使用 C 相关,请参阅 Extending PHP with C++? 了解与使用 C++ 相关的一些问题。

【讨论】:

【参考方案2】:

如果您的 C++ 是可执行的,您可以将其作为程序打开,通过 STDIN 将数据传递给它,然后通过 STDOUT 将返回值传递回 PHP。见proc_open­Docs

您的标准 C++ 库应该提供对 STDIN 和 STDOUT 的访问,因此您已经拥有所需的内容。

我对 c++ 如何在调用之间保持其状态有点困惑。 proc_open 可以用来通过 STDIN 传递给持续运行的 c++ 程序吗?我担心它会启动一个新的 c++ 实例

您可能正在寻找大多数操作系统支持的Named pipe­Wikipedia,这是一种进程间通信形式(另请参阅:What are named pipes?)。它是简单的 I/O (FIFO),与 STDIN 和 STDOUT 类似。您可以将可执行文件保存在内存中,而其他进程可以向其发送数据。

另一种简单的方法是使用套接字,PHP 也支持这些套接字,并且应该与您的 C/C++ 一起使用。套接字将在不同的机器上工作,因此您可以在仅执行计算的专用服务器上运行(内存/CPU 密集型?)自己的可执行文件。只是看起来更适合你的情况,从我读到的评论中你正在寻找进程间通信

posix_mkfifo­Docs (including sample PHP code in user-notes) Sockets Tutorial - a simple tutorial on using sockets for interprocess communication (Linux Howtos) Introduction to Named Pipes (Linux Journal) Introduction to Interprocess Communication Using Named Pipes (Sun Developer Network)

(这些只是一些资源,您自然可以通过一些研究找到更多,我认为对于命名管道和套接字,您应该能够找到适合您案例的源代码示例)

【讨论】:

@dcc310 如果你这样做,你可以从你的 PHP 程序中调用一次proc_open(并在接下来的运行中使用管道数组),这样你就可以拥有一个 C++ 实例每次运行 PHP 程序的程序。这是你需要的吗? 我不清楚你想让你的 C++ 可执行文件留在内存中。我扩展了关于进程间通信的两种方式的答案:命名管道sockets 抱歉,我花了一些时间来尝试一下。我在 C++ 中寻找更多的“服务器”,以便在多个 PHP 脚本中保留一个 C++ 实例。命名管道解决方案对我来说很好用:) 对于其他尝试这个的人,我发现这些链接有些帮助:my.opera.com/zomg/blog/2007/08/29/php-and-named-pipes 和 squirrelshaterobots.com/programming/php/… 和 squirrelshaterobots.com/programming/php/…【参考方案3】:

您可以尝试: exec()

您将 PHP 中的数据作为参数发送给将要执行的 C++ 编写程序,该程序将返回输出,以便您可以在 C++ 程序执行后在 PHP 中使用它。

【讨论】:

“对于 c++ 来说,在调用之间跟踪其变量很重要。” - 所以 exec 不会削减它。 嗯,他可以使用数据库或文件来进行持久数据存储!【参考方案4】:

我一直在使用gSOAP 在 C++ 和 PHP 之间进行远程过程调用,如果您使用的是 PHP5,则交互变得非常容易;见http://www.php.net/manual/en/class.soapclient.php

【讨论】:

以上是关于将 PHP 与本地 C++ 程序链接的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP Web 应用程序调用 C++ 库:system() 与 SWIG PHP 扩展?

将 32 位和 64 位 .so 文件与 g++ 链接以用于 c++ 程序

如何将本机 C++ 静态库链接到托管 C++ 程序集

将 C++ 库链接到具有非 C++ 主函数的程序

将 ruby​​ 库静态链接到 C++ 应用程序

将 JVM 嵌入 C++ 应用程序:如何正确链接?