将 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 pipeWikipedia,这是一种进程间通信形式(另请参阅: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 扩展?