什么是Linux中C和PHP之间良好的进程间通信方法

我实际上不知道我是否在问一个正确的问题。 让我先描述一下我的问题。

最终用户 Web服务器(通过PHP)内部进程(通过C或C ++)外部硬件

1应该像ajax请求。 2应该是进程间通信。 3应该是uart RS232通信。

最终用户将请求更改硬件上的某些设置,然后请求将传播到硬件。 硬件回复成功或失败,然后结果将传播回用户。 硬件回复延迟可以在1秒内。

因此,当Web服务器收到来自最终用户的ajax请求时,它将保存并向c / c ++程序发送IPC请求。 c / c ++程序将通过UART发送并保持并等待硬件回复。 对于UART部分,有异步uart模型,因此c / c ++程序不需要持续等待UART。

Web服务器将等待c / c ++程序返回(再次通过IPC),然后将结果转发回最终用户。

由于webserver没有内存,所以不能有任何异步的东西(据我所知)。

我可以想到一个通过文件或数据库的简单方法。 Web服务器不断读取文件或数据库以进行回复。

但我真的不认为这是一个好方法,因为它会导致服务器CPU周期的浪费。

如果我可以容忍一些延迟,那么这取决于,但我认为用户端的几秒延迟对他们来说是好的。

你能给我一些很好的IPC方法来实现我的目的吗?

而且,如果您认为整个过程或任何特定链接(包括链接1,2和3)有更好的解决方案(比我上面的描述),请同时分享您的2cent。

希望我能清楚地问我的问题。

谢谢。

您可以找到的最简单的解决方案是使用管道 。 这些过程将有一个开放的管道,用于读取“呼叫”并以相同的方式回答它们。

设置它的一种可能方法是在特定或可变位置具有一对命名管道( mkfifo )。 这个过程和PHP都知道这样的管道。 该过程将阻止在某些文本“协议”中读取请求/命令的循环,并通过另一个管道写回PHP。 这样,PHP和外部进程都可以停止/终止并重新启动,通信路径仍然是稳定的。

您可能需要执行其他操作以validation进程是否实际正在运行(如果需要),但是对此“协议”的简单“ping”命令就足够了。

这假定:

  • 您可以改进与硬件通信的过程(否则,您将受到它已经提供的任何东西的约束)
  • 你没有高性能要求(管道相对较慢)
  • 从PHP脚本到进程并发访问的情况下没有并行性问题(除非你做一些锁定,2个并发请求将被写入管道中)

当然还有其他方法可以实现这一目标,但我很难想到其他方式就像这样简单。 排队(d-bus,其他),正如一些评论中所建议的那样,只是建立在这个想法之上,但增加了更多的复杂性,因此,如果不需要这些其他服务提供的function,管道应该足够了。

只是我的2美分(应该是评论,但我没有声誉)使用zeromq或其他一些着名的排队库为您的IPC。

从理论上讲,使用fifos和域套接字非常简单,但实际上,您需要编写许多边缘情况。 例如,高水位标记,重新连接等。

你也可以在普通的C中拥有一个网络服务器!

检查mongoose和狸猫 。

第一个适用于ESP8266和ESP32等设备。

Mongoose是在Commercial和GNU GPL v.2开源许可下发布的。

Civetweb使用MIT许可证。