如何在PHP客户端和C守护进程服务器之间进行IPC?更新
并感谢您查看此问题。
背景
我有几台机器,它们在很短的时间内连续生成多个(最多300个)PHP控制台脚本。这些脚本运行速度快(不到一秒),然后退出。所有这些脚本都需要对大型trie结构进行只读访问,每次运行每个脚本时,将其加载到内存中的成本都非常高昂。服务器运行 Linux。
我的解决方案
创建一个 C 守护程序,它将 trie 结构保存在内存中,并接收来自 PHP 客户端的请求。它将接收来自每个PHP客户端的请求,对内存结构执行查找并使用答案进行响应,从而使PHP脚本免于执行该工作。请求和响应都是短字符串(不超过 20 个字符)
我的问题
我对C守护进程和进程间通信非常陌生。经过大量研究,我将选择范围缩小到消息队列和Unix域套接字。消息队列似乎足够了,因为我认为(我可能是错的)它们将所有请求排队,以便守护程序按顺序回答它们。不过,Unix域套接字似乎更容易使用。但是,我有各种问题,我无法找到答案:
- PHP 脚本如何发送和接收消息或使用 UNIX 套接字与守护程序进行通信?相反,C守护程序如何跟踪它必须向哪个PHP进程发送回复?
- 我见过的大多数守护进程示例都使用无限 while 循环,其中包含睡眠条件。我的守护程序需要为许多随时可能出现的连接提供服务,响应延迟至关重要。如果 PHP 脚本在休眠状态下发送请求,守护程序将如何反应?我已经阅读了有关投票和epoll的信息,这是等待收到消息的正确方法吗?
- 每个 PHP 进程将始终发送一个请求,然后等待接收响应。我需要确保如果守护程序关闭/不可用,PHP进程将在设定的最大时间内等待响应,如果没有收到答案,则将继续,而不是挂起。这能做到吗?
数据结构的实际查找速度非常快,我不需要任何复杂的多线程或类似的解决方案,因为我相信以FIFO方式处理请求就足够了。我还需要保持简单愚蠢,因为这是一个任务关键型服务,而且我对这种类型的程序相当陌生。(我知道,但我真的没有办法解决这个问题,学习经验会很棒)
我真的很感激代码片段,这些代码片段可以照亮我的具体问题。也欢迎提供指南和指针的链接,这些指南和指针将进一步加深我对这个低级IPC的模糊世界的理解。
感谢您的帮助!
更新
现在知道的比问这个问题时要多得多,我只想向任何感兴趣的人指出,Thrift框架和ZeroMQ在抽象出困难的套接字级编程方面都做得很好。Thrift甚至免费为您提供服务器的脚手架!
事实上,与其去构建网络服务器的所有艰苦工作,不如考虑使用已经为您解决问题的良好异步服务器编写应用程序服务器代码。当然,使用异步 IO 的服务器非常适合不需要密集 CPU 处理(否则为事件循环块)的网络应用程序。
Python的例子:Twisted,gevent。我更喜欢gevent,我不包括龙卷风,因为它专注于HTTP服务器端。
Ruby 的示例:EventMachine
当然,Node.js基本上是当今异步服务器的默认选择。