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 语言创建网络服务器!
第一个适用于 ESP8266 和 ESP32 等设备。
Mongoose 在商业和 GNU GPL v.2 开源许可下发布。
Civetweb 使用 MIT 许可证。
其实我不知道我问的问题对不对。让我先描述一下我的问题。
最终用户 <-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 语言创建网络服务器!
第一个适用于 ESP8266 和 ESP32 等设备。
Mongoose 在商业和 GNU GPL v.2 开源许可下发布。
Civetweb 使用 MIT 许可证。