如何在PHP和C ++之间建立通信?

时间:2015-10-28 21:27:09

标签: php c++ apache sockets

我对这个标题有疑问。因此,我尝试创建一个程序,该程序在C ++程序和运行Apache Web服务器的PHP站点之间传递数据/数据请求。

我一直在研究Socket通信,但我不理解这个概念。我理解如何在PHP中创建套接字,在c ++中创建另一个套接字,并让我们使用测试应用程序运行它们。但只是单独的,不是互相交谈或与我的网络服务器交谈(PHP目前不在服务器上,它在不同的服务器上)。那么这是如何工作的呢?根据我的理解,你需要一个人听一个端口号,另一个人要发一些东西给那个命令。

理想情况下,我宁愿不使用任何库来帮助我实现这一目标。我知道这个问题以前曾被问过多次,但我仍然无处可去。

有人可以提供上述工作原理的解释,或链接到这里/其他地方可能有帮助的问题吗?或者,如果有比使用套接字更好的方法吗?他们会互相交谈,速度可能是一个问题。

编辑,进一步说明:

Web服务器:我正在运行Apache Web服务器。 PHP脚本位于此服务器上。

C ++位置:测试时,我的c ++应用程序存储在运行Web服务器的Raspberry Pi上。在实际应用程序中,我的C ++应用程序仍将存储在同一设备上(但它不会成为Raspberry Pi - 但仍然是基于Linux的。)

通信:需要通过C ++脚本触发PHP脚本来执行操作,反之亦然。他们需要两种方式都需要传递数据(通用数据结构,但它们可能相当大)(因此两者都需要能够发送和接收数据)。

6 个答案:

答案 0 :(得分:14)

我认为最简单的方法是:

1)PHP - > C ++:tcp

2)C ++ - > PHP:http

将尝试解释。

1)从C ++应用程序中获取内容PHP使用stream_socket_client函数连接到该应用程序。 C ++应用程序正在使用socketbindlisten函数侦听主机和端口。一旦连接到达C ++应用accept,然后在单独的std::thread中提供(recv获取请求,send发送响应)。 How to socket

2)由于PHP在Apache Web Server下工作,我认为最简单的方法是使用libcurl库从C ++应用程序发出HTTP请求。 How to curl

答案 1 :(得分:7)

另一种方法可能是SOAP或REST Web服务。在双方,您可以提供SOAP Web服务来交换数据或调用远程函数。在C ++方面,您可以使用Apache Axis来提供SOAP服务器。在PHP方面,您可以使用内置SOAPServer类(http://php.net/manual/de/class.soapserver.php)。

使用SOAP,您只需通过HTTP / HTTPS在两个应用程序之间交换基于XML的消息。有了这个approch,两个应用程序都可以互相触发并交换数据。

答案 2 :(得分:2)

除了Ben Schnarr的答案之外,我认为最优雅和简单的解决方案可能是使C ++程序成为PHP代码中实现的Web服务的客户端。直接使用套接字会强制你在它上面有一个额外的协议来表示传输的数据(除非数据很简单,比如ASCII文本流),这有点像重新发明轮子。

我偏爱REST + JSON,因为它们易于实现和使用,而且功能非常强大。相比之下,SOAP非常复杂,资源丰富,而且很脆弱,特别是如果你在C ++中使用它。例如,我已经使用过的一个流行的实现会强制您在每次更改任何消息的布局时重新编译代码,即使服务器正在添加客户端不会使用的字段

在PHP方面,它非常简单 - 它已经拥有了你需要的所有基础设施。在C ++程序中,您需要的最小值是HTTP客户端库和JSON编解码器。我使用libcurl作为第一个(迄今为止最受欢迎的)和jsoncpp作为后者,但两者都有其他选项。最近,一些图书馆出现了整个包装,但我还没有机会使用它们。一些例子:

restclient

REST SDK

Restbed

答案 3 :(得分:1)

如果你需要一些关于stas告诉你的指导,那么我建议你看看

http://us2.php.net/manual-lookup.php?pattern=fsock&src= {引荐:源?} http://us2.php.net/manual-lookup.php?pattern=socket&src= {引荐:源}

在C ++中,您将要创建一个接受命令的TCP侦听器(显然您希望在其中添加一些验证方法), 然后使用PHP打开一个连接(使用你选择的fsock或socket - fsock更容易),并将数据写入你的C ++监听器。它是ezpz

//使用一些示例代码进行更新

// protocol://ip, port, $errno, $errstr, $timeout
$fp = fsockopen("tcp://ip", 1337, $errno, $errstr, 30);
if(!$fp) die('failed connection or something');

//write something

fwrite($fp, "stuffs to write");

// get a reply?

while (!feof($fp)) {
    echo fgets($fp, 128); // where 128 is size
}

答案 4 :(得分:1)

我建议你使用Unix套接字 对于c ++,请检查:http://www.linuxhowtos.org/C_C++/socket.htm

对于php,请检查:stream_socket_client

您可以从两个流程内部传递信息。

希望你能解决它,不要放弃。

答案 5 :(得分:1)

SOAP解决方案可以解决问题,但在我看来,它使应用程序部署变得非常复杂。

您可以在几个级别上直接使用XML-RPC

这里有两个有趣的链接,展示了如何用两种语言实现客户端和服务器。

XML-RPC for C++

XML-RPC for PHP

还有其他XML-RPC for C ++的实现(我没有在PHP中使用这种方法,所以我不知道其他的替代方法),不要只坚持一个,尝试与他人一起使用你感觉更多很舒服。