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