php - 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?

标签 php c ipc daemon

并感谢您查看问题。

背景
我有几台机器在很短的时间内连续生成多个(最多 300 个)PHP 控制台脚本。这些脚本运行很快(不到一秒)然后退出。所有这些脚本都需要对大型 trie 进行只读访问。每次运行每个脚本时将其加载到内存中的成本非常高。服务器运行Linux。

我的解决方案
创建一个 C 守护进程,将特里结构保存在内存中并接收来自 PHP 客户端的请求。它将接收来自每个 PHP 客户端的请求,在内存结构上执行查找并响应答案,从而避免 PHP 脚本执行该工作。请求和响应都是短字符串(不超过 20 个字符)

我的问题
我对 C 守护进程和进程间通信非常陌生。经过大量研究,我将选择范围缩小到消息队列和 Unix 域套接字。消息队列似乎足够了,因为我认为(我可能错了)它们将守护进程的所有请求排队,以串行方式回答它们。不过,Unix 域套接字似乎更易于使用。但是,我有各种问题无法找到答案:

  • PHP 脚本如何发送和接收消息或使用 UNIX 套接字与守护进程通信?相反,C 守护进程如何跟踪它必须向哪个 PHP 进程发送回复?
  • 我见过的大多数守护进程的例子都使用了一个无限的 while 循环,里面有一个 sleep 条件。我的守护进程需要为许多随时可能到来的连接提供服务,响应延迟很关键。如果 PHP 脚本在休眠时发送请求,守护进程会如何 react ?我已经阅读了 poll 和 epoll,这是等待收到消息的正确方法吗?
  • 每个 PHP 进程总是会发送一个请求,然后会等待接收响应。我需要确保如果守护进程关闭/不可用,PHP 进程将在设定的最长时间内等待响应,如果没有收到响应,则不管而不是挂起都会继续。这能做到吗?

  • 数据结构的实际查找非常快,我不需要任何复杂的多线程或类似的解决方案,因为我相信以 FIFO 方式处理请求就足够了。我还需要保持简单愚蠢,因为这是一项关键任务服务,而且我对这种类型的程序还很陌生。 (我知道,但我真的没有办法解决这个问题,学习经验会很棒)

    我真的很感激代码片段,这些代码片段可以让我对我的具体问题有所了解。也欢迎链接到指南和指针,以进一步了解这个低级 IPC 的阴暗世界。

    谢谢你的帮助!

    更新

    现在比我问这个问题时知道的要多得多,我只是想向任何感兴趣的人指出 Thrift框架和 ZeroMQ在抽象出困难的套接字级编程方面做得非常出色。 Thrift 甚至免费为您提供服务器的脚手架!

    事实上,与其进行构建网络服务器的所有艰苦工作,不如考虑使用已经为您解决问题的良好异步服务器编写应用程序服务器代码。当然,使用异步 IO 的服务器非常适合不需要密集 CPU 处理(或者事件循环阻塞)的网络应用程序。

    python 示例:Twisted , gevent .我更喜欢 gevent,我不包括 Tornado,因为它专注于 HTTP 服务器端。

    Ruby 示例:EventMachine

    当然,Node.js现在基本上是异步服务器的默认选择。

    如果您想深入了解,请阅读 C10k Problem , 和 Unix Network Programing .

    最佳答案

    我怀疑 Thrift是你想要的。您必须编写一些胶水代码来执行 PHP <-thrift-> C++ <-> C,但这可能比自己编写代码更健壮。

    关于php - 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746207/

    相关文章:

    java - 如何将数据库中的信息(使用 java 代码检索)打印为 html?

    c - 使用 mmap 分配双二维数组

    C - fork() 和共享内存

    c - 返回一个二维字符数组

    android - 不同语言的两个进程是否可以使用UDP进行通信

    c++ - 对于第一个进程保持运行而后续进程仅传递参数的最佳 IPC 方法是什么?

    php - 是否有任何代码库可以验证/将博客评论转换为严格的 XHTML?

    php - 如何修复插入数据到第二个表

    php - 使用 mysql_num_rows 显示页码

    c - 使用fgetc逐行读取不起作用