实际上,我不知道我是否在问一个恰当的问题。让我先描述一下我的问题。
终端用户<-1-> web服务器(通过PHP) <-2->内部进程(通过C或C++) <-3->外部硬件
1应该类似于ajax请求。2应该类似于进程间的交流。3应该是uart RS232通信。
最终用户将请求更改硬件上的某些设置,然后请求将传播到硬件。硬件应答成功或失败,结果将传回给用户。硬件应答延迟可在1秒内完成。
因此,当when服务器接收到来自最终用户的ajax请求时,它将保存并向c/c++程序发送IPC请求。c/c++程序通过UART发送,等待硬件回复。对于UART部分,有异步UART模型,因此c/c++程序不需要继续等待uart。
end服务器将等待c/c++程序返回(再次通过IPC ),然后将结果转发给最终用户。
因为has服务器没有内存,所以不可能有任何异步的东西(据我理解)。
我可以想到一个简单的方法,就是通过文件或数据库。The服务器持续读取文件或数据库以进行回复。
但我并不认为这是一个好方法,因为它会导致服务器CPU周期的浪费。
如果我能容忍一些延迟,嗯,这取决于,但我认为在用户端几秒钟的延迟对他们来说是可以的。
你能建议我一些很好的IPC方法来达到我的目的吗?
如果你认为有一个更好的解决方案(比我上面的描述)对整个过程或任何具体的链接(包括链接1,2和3),请也分享你的2分钱。
希望我能清楚地提出问题。
谢谢。
发布于 2015-02-01 18:09:45
您可以找到的最简单的解决方案可能是使用管道。这些过程将有一个打开的管道来读取“呼叫”,并以同样的方式回答它们。
一种可能的设置方法是在一个特定的或可变的位置拥有一对命名管道(mkfifo)。这个过程和PHP都知道这样的管道。该过程将阻止读取某个文本“协议”中的请求/命令的循环,并通过另一个管道将其写回PHP。这样,PHP和外部进程都可以停止/终止和重新启动,通信路径仍然是稳定的。
如果需要的话,您可能需要做一些其他的事情来验证进程是否真的在运行,但是在这个“协议”上使用一个简单的"ping“命令就足够了。
这假定:
当然还有其他的方法来实现这一点,但我发现很难考虑其他的方法,就像这样简单。排队(d-bus,其他),如一些评论中所建议的,只是建立在这个想法之上,但增加了更多的复杂性IMHO,因此,如果不需要这些其他服务提供的功能,管道就足够了。
发布于 2015-02-05 02:38:40
只要我的2分钱(应该是一个评论,但我没有声誉)使用零或其他一些著名的队列库为您的ipc。
从理论上讲,使用fifos和域套接字非常简单,然而,在实践中,您需要对很多边缘情况进行编码。例如,高水位标志,重新连接等。
https://stackoverflow.com/questions/28261364
复制相似问题