如何设置 PHP 和 C++ 之间的通信?
Posted
技术标签:
【中文标题】如何设置 PHP 和 C++ 之间的通信?【英文标题】:How to set up communication between PHP and C++? 【发布时间】:2016-01-28 20:47:52 【问题描述】:我有一个关于标题问题的问题。因此,我正在尝试创建一个程序,该程序在 C++ 程序和运行 Apache Web 服务器的 php 站点之间传递数据/数据请求。
我一直在研究 Socket 通信,但我不理解这个概念。我了解如何在 PHP 中创建一个套接字,在 c++ 中创建另一个套接字,并且我让它们使用测试应用程序运行。但只是单独的,不互相交谈或与我的网络服务器交谈(PHP 目前不在服务器上,它在不同的服务器上)。那么这是如何工作的呢?据我了解,您需要一个监听端口号,另一个负责向该命令发送内容。
理想情况下,我不希望使用任何库来帮助我实现这一目标。我知道这个问题之前已经被问过很多次了,但我仍然无处可去。
有人可以解释上述工作原理,或链接到此处/其他地方可能有帮助的问题吗?或者如果有比使用套接字更好的方法来做到这一点?他们会经常互相交谈,速度可能是个问题。
编辑,进一步解释:
Web 服务器:我正在运行 Apache Web 服务器。 PHP 脚本位于此服务器上。
C++ 位置:在测试时,我的 c++ 应用程序存储在运行 Web 服务器的同一个 Raspberry Pi 上。在真正的应用程序中,我的 C++ 应用程序仍将存储在同一设备上(但它不会是 Raspberry Pi - 虽然仍然基于 Linux)。
通信:PHP 脚本需要被 C++ 脚本触发才能执行操作,反之亦然。它们都需要以每种方式传递数据(常见的数据结构,但它们可能相当大)(因此两者都需要能够发送和接收数据)。
【问题讨论】:
你说 php 应用程序与 c++ 应用程序位于不同的服务器上?会一直这样吗? 这个问题很模糊。两个程序会在同一台服务器上运行吗?一种方式还是两种方式的通信?这是客户端/服务器类型的关系吗?或者也许是工人/队列类型的关系? php 是否在网络服务器(apache、ngnx 等)后面运行? 您好,请详细说明您的用例,只要使用相同的协议,两者都可以通信,如果您的 php 在网络服务器上,那么最好是 http/https(我假设 C++ 是客户端和 PHP是服务器)。如果 php 是 cli,那么您的选项可以扩展到 udp、tcp。您还可以使用 C++ 发送电子邮件并使用 PHP 检查接收,定期使用 wget 和 cron 作业等。 如果它是基于 web 的 php,则不需要原始套接字。只需获取一个 c++ http 库,然后像使用浏览器/html/forms 一样与 php 对话。 更新了我的问题。感谢您的帮助(让我扩展我的问题) 【参考方案1】:如果你需要一些关于 stas 告诉你的指导,那么我建议你看看
http://us2.php.net/manual-lookup.php?pattern=fsock&src=referrer:source? http://us2.php.net/manual-lookup.php?pattern=socket&src=referrer:source?
在 C++ 中,您需要创建一个接受命令的 TCP 侦听器(显然,您需要放入一些验证方法), 然后使用 PHP 打开一个连接(使用 fsock 或您选择的套接字 - 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
【讨论】:
【参考方案2】:除了 Ben Schnarr 的回答之外,我认为最优雅和最简单的解决方案可能是让 C++ 程序成为在 PHP 代码中实现的 Web 服务的客户端。直接使用套接字将迫使您在其上使用附加协议来表示正在传输的数据(除非数据非常简单,例如 ASCII 文本流),这有点像重新发明***。
我偏爱 REST+JSON,因为它们易于实现和使用,而且非常强大。相比之下,SOAP 相当复杂、资源繁重且脆弱,尤其是在将它与 C++ 一起使用时。例如,我已经使用过的一种流行实现会在每次更改任何消息的布局时强制您重新编译代码,即使服务器正在添加客户端不会使用的字段。
在 PHP 方面,这很容易 - 它已经拥有您需要的所有基础设施。在 C++ 程序上,您至少需要一个 HTTP 客户端库和一个 JSON 编解码器。我将 libcurl 用于第一个(迄今为止最流行的)和 jsoncpp 用于后者,但两者都有其他选项。最近,一些库出现在整个包中,但我还没有机会使用它们。一些例子:
restclient
REST SDK
Restbed
【讨论】:
【参考方案3】:SOAP 解决方案可以解决问题,但在我看来,它会使应用程序部署变得复杂。
您可以往下走几个层次,直接使用XML-RPC。
这里有两个有趣的链接,展示了如何以两种语言实现客户端和服务器。
XML-RPC for C++
XML-RPC for PHP
XML-RPC for C++还有其他的实现方式(我没有在PHP中使用过这种方式,所以我不知道其他的替代方案),不要只坚持一个,尝试其他的,使用你觉得更多的舒服。
【讨论】:
【参考方案4】:我推荐你使用 Unix Sockets 对于 c++,请检查:http://www.linuxhowtos.org/C_C++/socket.htm
对于 php,请检查:stream_socket_client
您可以从两个进程内部传递信息。
希望你能解决,不要放弃。
【讨论】:
【参考方案5】:另一种方法可能是 SOAP 或 REST Web 服务。在双方,您都可以提供一个 SOAP Web 服务来交换数据或调用远程函数。在 C++ 端,您可以使用 Apache Axis 来提供 SOAP 服务器。在 PHP 端,您可以使用内置的 SOAPServer 类 (http://php.net/manual/de/class.soapserver.php)。
使用 SOAP,您只需通过 HTTP / HTTPS 在两个应用程序之间交换基于 XML 的消息。使用这种方法,两个应用程序可以相互触发并交换数据。
【讨论】:
IMO 这是最好的解决方案,因为即使设置需要一点工作,它也提供了最大的灵活性,如果 OP 决定更改一个程序,那么它破坏的可能性最小并且修复它的最简单方法(只需确保 REST 或 SOAP Web 服务按预期工作)。它甚至允许更改为不同的语言。 Apache/PHP 基本上是为使用 HTTP 而设计的。 Restful 或 SOAP 或基于 JSON 的等价物正在流行,它们会以最小的开销为您解决问题,因为您可以找到几个可以为您完成大部分结构性工作的框架。【参考方案6】:我认为最简单的方法是:
1) PHP -> C++ : tcp
2) C++ -> PHP : http
会尽力解释。
1) 要从 C++ 应用程序中获取某些内容,PHP 使用 stream_socket_client 函数连接到该应用程序。 C++ 应用程序正在使用socket
、bind
和listen
函数监听主机和端口。一旦连接到达 C++ 应用程序 accept
它,然后在一个单独的 std::thread
服务它(recv
获取请求,send
发送响应)。 How to socket.
2) 由于 PHP 在 Apache Web Server 下工作,我认为最简单的方法是使用 libcurl
库从 C++ 应用程序发出 HTTP 请求。 How to curl.
【讨论】:
感谢您的详细解答。我打算在这周晚些时候试一试。如果它运作良好,我会回来并将其标记为我的答案:)以上是关于如何设置 PHP 和 C++ 之间的通信?的主要内容,如果未能解决你的问题,请参考以下文章