php - linux下C和PHP进程间通信有什么好的方法

标签 php c++ c linux ipc

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

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

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

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

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

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

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

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

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

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

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

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

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

谢谢。

最佳答案

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

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

如果需要的话,您可能需要做一些其他事情来验证进程是否真的在运行,但是通过这个“协议(protocol)”执行一个简单的“ping”命令就足够了。

假设:

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

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

关于php - linux下C和PHP进程间通信有什么好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28261364/

相关文章:

php - Referer 和 Varnish 缓存条件代码不起作用

php - 如何修复新文件夹项目中未确定的命名空间?

c++ - 如何检查网站是否包含 C++ 中的字符串?

c++ - 锁定文件,使其无法删除

php - 如何在 php 中生成安全的激活字符串?

php - 为 HTML 输入字段格式化 MySQL 查询

c++ - Qt避免警告QProcess : destroyed while process still running (Assistant)

c++ - QMetaProperty::read: 无法处理未注册的数据类型 'TreeItem<InspectorItem>*'

c - 如何在c中检查给定的二进制地址是ipv4还是ipv6

c - 为什么C中标识符可以包含 '$'?