在C和PHP之间传递数据

3
我有两个应用程序 - 一个php web应用程序和一个c程序。php应用程序必须向c程序发送数据,后者返回结果。 由于必须将先前输入的数据保留在内存中,因此c程序必须一直在循环中运行(while(true))。
我通过使用文件(input & output files)来处理c和php之间的数据传递问题。 如果我的web应用程序发生变化,我的php脚本会更新一个文件,然后被我的c程序读取。输出被写入另一个文件。Web应用程序一直在寻找变化。
我认为这不是解决这个问题的最聪明的方法。可能存在着大量不必要的文件访问。
在以下主题的启发和帮助下,我认为使用一种c php服务器桥接可能是一个好的解决方案。 如何在php(web应用程序)中传递值并运行c程序 在linux中在PHP和C可执行文件之间传递数据 我已经开始使用mongoose。Mongoose是一个非常轻量级的Web服务器。 我的当前想法是,我的Web应用程序将通过POST直接向我的C程序发送数据。请求由Mongoose Web服务器处理。 这是正确的方式吗?还是将其拆分为两个应用程序更好 1)处理输入输出的Web服务器 - 两个程序之间的变量通过共享内存传递 2)我的当前C程序用于我的操作(通过共享内存进行输入/输出) 还是这完全是错误的方法,a)我应该坚持我的文件解决方案b)还有更好的方法? 对不起,我问了这么多问题,但我对C相当新,并且遇到了很多困难,对所有这些并不感到自信。
编辑 我试图更具体地说明我的C程序在做什么。基本上它是一个模拟器。它就像一个状态流,有大约20-40个输入,都是整数,大多数时间只是0或1。程序根据输入和先前的状态进行操作。在一次迭代后,通过将输入文件更改为原始状态来重置输入。
输出文件会随着相应的输出值不断更新(例如 var = 1 var2 = 3)。

你是否遇到并发问题?如果有多个PHP请求同时发生,如何防止它们在C程序运行时相互干扰? - Dwayne Towell
不是很需要,该应用程序一次只需处理一个请求。只会有一个用户输入状态。 输出对于每个人都是相同的。我思考了这个问题,如果需要处理具有不同输入的不同会话怎么办。基本上,我需要为每个模拟创建一个新的C程序实例。由于我没有任何处理此问题的想法,因此我坚持使用当前的解决方案。 - jonas
1
由于我最近一直在使用ZeroMQ等相关技术,所以在提供建议的同时,我建议在C程序端使用一个事件循环(或轮询机制)来使用ZeroMQ。使用PHP解码JSON数据,使用ZeroMQ将消息推送到C程序。 C程序作为服务器,当PULL ZeroMQ套接字上有数据可读时做出反应。 它阅读消息,解码JSON并执行工作。任务完成。 这是很多要吸收的内容,但实际的代码从C和PHP两个方面来看都非常简洁,而且完全优化。 - N.B.
谢谢你提供的这个想法。 我对ZeroMQ进行了一些研究,它看起来很不错。 我已经尝试过一些操作,基本上看起来相当简单,几分钟之后就能得到一个php示例。 目前我正在努力创建一个C程序(也许在cygwin下无法正常工作?),但问题可能是我对C语言知识的欠缺。 但如果我能够理解并解决我的基本问题,我会选择使用它。这个演示视频http://vimeo.com/20605470给出了很好的第一印象。 - jonas
我建议你研究一下管道。两种语言都提供基本支持,这样数据就不必实际上命中磁盘,除非一个进程“领先”另一个进程。 - Dwayne Towell
2个回答

1

谢谢您的建议,我要分享的数据只有int类型(大多数情况下只有0/1),可能会有40个左右的变量。我认为使用数据库管理系统会太过复杂,而且我也看不出与基于文件的解决方案有什么大的区别(除了我不需要的管理方面)。我会尝试编辑我的帖子,以更具体地说明C程序的功能。 - jonas

0

我会将这个C程序开发为SOAP WebService,这样它就可以被执行一次并等待请求。(或者最终以CGI模式工作,如果需要的话)

您的PHP脚本(使用SOAP库)可以调用您程序中的单个C函数并接收其结果。所有数据,如函数参数、对象等,都使用XML语法在不同语言之间交换。

我曾经使用gSOAP建立PHP、C和Python之间的通信,效果很好。它是正式用于C++的,我知道这不是正确的做法,但由于它们是兼容的,所以您可以混合使用。


谢谢你的想法。我认为这是一个好方法。但我觉得它有点重。如果我使用另一种语言,比如Java,我会采用这种方法。使用C看起来比例如mongoose或特别是ZeroMQ更耗时和复杂。 - jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接