Linux中C和PHP有什么好的进程间通信方式

What is a good Inter-Process Communication method between C and PHP in Linux

其实我不知道我问的问题对不对。让我先描述一下我的问题。

最终用户 <-1-> 网络服务器(通过 PHP)<-2-> 内部进程(通过 C 或 C++)<-3-> 外部硬件

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

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

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

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

由于网络服务器没有内存,所以不可能有任何异步的东西(据我了解)。

我能想到一个简单的方法,就是通过文件或数据库。网络服务器不断读取文件或数据库以进行回复。

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

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

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

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

希望我问清楚了我的问题。

谢谢。

您能找到的最简单的解决方案可能是使用管道。这些进程将有一个开放的管道来读取 "calls" 并以相同的方式回答它们。

一种可能的设置方法是在特定或可变位置放置一对命名管道 (mkfifo)。此进程和 PHP 都知道此类管道。该过程将阻止在某些文本 "protocol" 中读取 requests/commands 的循环,并通过另一个管道写回 PHP。这样 PHP 和外部进程都可以 stopped/killed 并重新启动,通信路径仍然稳定。

如果需要的话,您可能需要做一些其他事情来验证该进程是否确实是 运行,但是一个简单的 "ping" 命令可以用于 "protocol"够了。

假设:

  • 您有可能改进与硬件通信的流程(否则,您将受制于它已经提供的任何内容)
  • 你对性能要求不高(管道比较慢)
  • 如果要处理来自 PHP 脚本的并发访问,则没有并行性问题(除非你进行一些锁定,否则 2 个并发请求将在管道中混合写入)

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

只是我的 2 美分(应该是评论,但我没有声誉)为您的 ipc 使用 zeromq 或其他一些众所周知的队列库。

从理论上讲,使用 fifos 和域套接字非常简单,但是,在实践中,您需要编写代码来应对许多边缘情况。例如,高水位线、重新连接等

您也可以使用纯 C 语言创建网络服务器!

检查mongoose and civetweb

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

Mongoose 在商业和 GNU GPL v.2 开源许可下发布。

Civetweb 使用 MIT 许可证。