我一直在研究这几个小时,但我所看到的一切看起来都相当令人生畏。到目前为止,我一直在使用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 ++,是否有一些流行的库,或者是否有另一种语言的简单实现?
谢谢!
答案 0 :(得分:5)
如果您只想从PHP访问C ++程序(或使用PHP作为C ++代码的Web前端),则通过套接字进行通信的替代方法是将C ++代码作为扩展嵌入到PHP中。
有相当多的样板代码与之相关,但大部分是由ext_skel
脚本(包含在PHP源代码中)为您生成的。
关于编写PHP扩展的大多数在线信息与使用C有关,请参阅Extending PHP with C++?以了解与使用C ++相关的几个问题。
答案 1 :(得分:3)
如果您的C ++是可执行的,您可以将其作为程序打开,通过STDIN将数据传递给它,并通过STDOUT将返回值传递回PHP。请参阅proc_open
Docs。
您的标准C ++库应提供对STDIN和STDOUT的访问权限,因此您已经拥有了所需的内容。
我对c ++如何在调用之间保持状态感到有些困惑。 proc_open可以用来通过STDIN传递给一个持续运行的c ++程序吗?我担心它会启动c ++的新实例
您可能正在寻找Named pipeWikipedia,这是一种进程间通信形式(请参阅:What are named pipes?),大多数操作系统都支持这种通信。与STDIN和STDOUT相比,它是简单的I / O(FIFO)和类似的。您可以将可执行文件保存在内存中,而其他进程可以将数据发送到内存中。
另一种简单的方法是使用套接字,这些套接字也由PHP支持,并且应该与您的C / C ++一起使用。套接字可以在不同的机器上运行,因此您可以在仅执行计算的专用服务器上运行(内存/ CPU密集型?)自己的可执行文件。只是看看哪种情况更适合你的情况,从我读到的评论中你正在寻找进程间通信。
posix_mkfifo
Docs (including sample PHP code in user-notes) (这些只是一些资源,您自然可以通过一些研究找到更多资源,我认为对于命名管道和套接字,您应该能够为您的案例找到源代码示例)
答案 2 :(得分:2)
您可以尝试: exec()
您从PHP发送数据作为将要执行的C ++编写程序的参数,程序将返回输出,以便您可以在执行C ++程序后在PHP中使用它。
答案 3 :(得分:1)
我一直在使用gSOAP进行C ++和PHP之间的远程过程调用,如果你使用的是PHP5,那么交互非常简单;见http://www.php.net/manual/en/class.soapclient.php