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