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

2024-06-22

感谢您查看这个问题。

的背景
我有几台机器可以在很短的时间内连续生成多个(最多 300 个)PHP 控制台脚本。这些脚本运行速度很快(不到一秒),然后退出。所有这些脚本都需要对大型文件进行只读访问trie http://en.wikipedia.org/wiki/Trie每次运行每个脚本时将其加载到内存中的成本非常昂贵。服务器运行Linux。

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

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

  1. PHP 脚本如何发送和接收消息或使用 UNIX 套接字与守护程序通信?相反,C 守护进程如何跟踪它必须向哪个 PHP 进程发送回复?
  2. 我见过的大多数守护进程示例都使用无限 while 循环,其中包含睡眠条件。我的守护进程需要为随时可能出现的许多连接提供服务,并且响应延迟至关重要。如果 PHP 脚本在休眠时发送请求,守护进程将如何反应?我读过有关 poll 和 epoll 的内容,这是等待收到消息的正确方法吗?
  3. 每个 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.


我猜测Thrift http://incubator.apache.org/thrift/就是你想要的。您必须编写一些粘合代码来执行 PHP C++ C,但这可能比您自己编写更强大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC? 的相关文章

  • 使用 C# 将文件列表从 ftp 下载到本地文件夹? [复制]

    这个问题在这里已经有答案了 我希望将 ftp 中的所有文件下载到本地文件夹 下载到本地驱动器后 所有文件都应在 ftp 中删除 从下面的代码 我只能从 ftp 下载一个我不期望的文件 我需要将所有文件放在一个文件夹中 但不放在本地文件名的名
  • 在 MySQL 数据库中存储大文件的更好方法?

    我有一个 PHP 脚本 您可以使用它上传非常大的文件 最大 500MB 并且该文件的内容存储在 MySQL 数据库中 目前我做这样的事情 mysql query INSERT INTO table VALUES uploadedfile f
  • C++ 局部变量销毁顺序

    C 11 中是否存在局部变量释放的定义顺序 更简洁地说 同一作用域中两个局部变量的析构函数的副作用将以什么顺序变得可见 e g struct X X do something int main X x1 X x2 return 0 Is x
  • main() 是用户定义函数吗? [复制]

    这个问题在这里已经有答案了 程序员does定义内部发生的事情main 毕竟 那么 它应该被视为用户定义的函数吗 C 标准没有用户定义函数的概念 相反 它有一个概念库函数 main 不是库函数 但是 该标准还对其签名提出了一些要求 并且不得重
  • 为什么要在 C 和 C++ 项目中创建 include/ 目录?

    当我处理我的个人 C 和 C 项目时 我通常把file h and file cpp在同一目录中 然后file cpp可以参考file h with a include file h 指示 然而 通常会发现库和其他类型的项目 如 linux
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • 无符号长十六进制表示

    include
  • 在 UserControl C# .NET 中添加/停靠控件

    我正在编写一个 UserControl 它以编程方式添加子控件 目前我正在添加新的控件 如下所示 this Controls Add new Control Height 16 Dock DockStyle Top 我遇到的问题是新控件添加
  • 如何为 IAsyncOperation 指定回调方法

    是否可以指定一个方法完成后调用async手术 平台 C Windows Phone 8 我需要实现非阻塞方法来异步发送UDP数据包 他们有我的方法 onWriteComplete int errorCode 操作完成时回调 这是我尝试过的
  • 如何重命名 MacOS/X 程序中的程序名称菜单标签?

    我有一个在 MacOS X 下运行的基于 Qt 的 GUI 程序 我希望能够更改该程序的第一个菜单标题的标签 即此屏幕截图中用红色圈出的标签 有没有一种编程方法可以做到这一点 假设不存在基于 Qt 的解决方案 则 Objective C 本
  • 使用自定义对象的动态列表并且无法动态更改dataGrid的单元格属性

    我刚开始在 Stack 上发帖 我已经搜索了很长一段时间来解决与我类似的问题 我试图根据对象的布尔值动态地将 WinForms DataGridView 中的复选框从非只读更改为只读 它在调试模式下显示更改已经发生 但是一旦完全运行 应该只
  • C++ 中的结构填充

    如果我有一个struct在 C 中 有没有办法安全地将其读 写到跨平台 编译器兼容的文件中 因为如果我理解正确的话 每个编译器都会根据目标平台进行不同的 填充 不 那是不可能的 这是因为C 在二进制层面缺乏标准化 Don Box http
  • iText7 RegexBasedLocationExtractionStrategy 如何获取找到的文本的字体名和字体大小

    我尝试在 C 上使用 iText7 进行文本替换 我只能使用 RegexBasedLocationExtractionStrategy 获取搜索文本的内容和矩形 并且我想获取文本的字体和大小 有什么建议么 谢谢 你可以实施IText提取策略
  • Microsoft Build Tools 2013 缺少 v120 目录

    我们已经安装了 Microsoft Build Tools 2013 从http www microsoft com en us download details aspx id 40760 http www microsoft com e
  • PHP 构建/集成工具:您使用它们吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • php 32位日期解析1901年12月13日之前的日期

    我很高兴使用strtotime http www php net manual en function strtotime php在我的开发机器上解析日期 其中一些日期是 1800 年代 一个极端的例子是 1500 年代 但我的开发机是64
  • MVC - 从视图调用控制器

    我是 MVC 新手 我正在使用 MVC 开发一个 Web 应用程序 该应用程序仅包含一个页面 所以在这个视图中我必须填充多个数据 假设应用程序是 新闻提要 应用程序 我需要填充最近的新闻 您喜欢的新闻 您朋友推荐的新闻等 那么我应该从视图到
  • 如何在C++中动态调用函数

    除了 boost Bind Function 之外 我如何在 C 中动态调用函数 PHP has obj new MyObject function doSomething obj gt function Objective C 有 MyO
  • ImagickException 并显示消息 Postscript delegate 在 MAMP 3.0.5 上失败

    我正在尝试使用 MAMP 3 0 5 将 PDF 转换为 png 文件 我知道我的 PHP 代码可以在我们的 Linux 服务器上正常运行 我在 Mac OSX 10 8 5 上安装了 MAMP 3 0 5 当我运行脚本将 PDF 转换为
  • 我使用 difftime 的 c 函数有时会返回 65535

    我有一个函数 使用 difftime 来检测自通信心跳停止以来的时间 以秒为单位 该函数的运行速度可以达到每 50 毫秒一次 该函数似乎可以工作 除了偶尔返回 65535 之外 我可以将执行次数减少到每秒一次 因为 difftime 的返回

随机推荐

  • XML/PHP:序言中不允许出现内容

    我收到此消息错误 但我不知道问题出在哪里 xml
  • 如何在上传时禁用页面上的所有按钮?

    我在客户端使用 json jquery 我想在上传文件时禁用页面上找到的所有按钮 目前我仅使用其 id 禁用上传按钮 如下所示 upload attachment button addClass ui state disabled 我想知道
  • Spring安全空指针异常

    我正在尝试将数据库中的用户映射到 Spring Security 用户 但运气不佳 我的 UserServiceImpl 如下 当我通过 servlet 调用它时 自动装配通常工作正常 但在 Spring Security 中使用时会抛出空
  • Xamarin.Forms:MultiLineLabel 不再在 Android 上运行

    在我的 Xamarin Forms 项目中 我使用多行标签在 1 行或 2 行上显示标题 具体取决于文本长度 我是基于这个blog http depblog weblogs us 2016 06 27 xamarin forms multi
  • 如何使用 lambda 流迭代嵌套列表?

    我正在尝试使用 stream 将以下代码重构为 lambda 表达式 尤其是嵌套的 foreach 循环 public static Result match Response rsp Exception lastex null for F
  • Magento - 2 个或更多观察者关注同一事件

    我的 2 个观察者正在观察相同的情况sales order shipment save before event ModuleA是我先创建的 然后我创建的ModuleB 现在只ModuleB的观察者被调用而不是ModuleA 请让我知道我该
  • EVP_get_cipherbyname 始终返回 null

    我打电话时遇到问题EVP get cipherbyname在 macOS 上 const char cipher str aes 256 cbc const evp cipher st cipher1 EVP aes 256 cbc con
  • 显示我的 C# Windows 窗体时关闭“拖动时显示窗口内容”设置

    有一个窗口显示设置称为 拖动时显示窗口内容 http www thewindowsclub com disable show windows contents while dragging http www thewindowsclub c
  • 如何触发预定的 Spring Batch 作业?

    我希望能够使用 REST 控制器启动我的作业 然后当作业启动时 它应该按计划运行 直到我再次使用 REST 停止它 这是我的控制器 RestController public class LauncherController Autowir
  • Jms 消息仅确认,直到消息确认为止

    如何确保消息确认仅删除在 jms 代理中调用确认的消息之前的消息 目前我有一个系统 它从 jms 队列中消费并部分处理它 稍后 一批这些消息将由不同的线程保存 我现在需要确认消息 但问题是我必须停止使用消息 否则确认先前收到的消息也将确认收
  • ActiveX,安装不起作用

    我想创建并部署一个 ActiveX 插件 非常小的东西 我只想显示一个消息框 我为它创建了一个库项目并将其编译为 DLL 当我通过命令行注册 dll 时 该插件可以工作 regasm 在一台机器上 所以我现在需要创建一个安装程序 将其放入
  • iOS 自动释放池块

    当我开始阅读苹果关于内存管理的文档时自动释放池块有件事让我思考 Any object sent an autorelease message inside the autorelease pool block is released at
  • PHP 使用 Fsockopen 发布数据

    我正在尝试使用 fsockopen 发布数据 然后返回结果 这是我当前的代码
  • 猫和印刷有什么区别?

    cat and print两者似乎都在 R 中提供了 打印 功能 x lt Hello world n cat x Hello world print x 1 Hello world n 我的印象是cat最类似于典型的 打印 功能 我什么时
  • 通过另一个函数访问一个函数的返回值

    总的来说 我对编程还很陌生 刚刚开始真正接触Python 我正在做一个猜数字项目 import random def main main function print Welcome to the number guesser game r
  • 创建一个控件似乎打破了 JFX8 上的透明阶段

    上面的程序应该创建一个带有一些文本的透明舞台 但舞台看起来不透明 public class Test extends Application Override public void start Stage primaryStage new
  • 如何查找数组中存储的字符串中的数字之和

    我已经弄清楚如何从单个字符串计算数字的值 作为示例 var sum 13 2 10 7 3 split reduce function x y return parseInt x parseInt y Value of 35 我有兴趣找到数
  • 不区分大小写的列表

    我需要一个不区分大小写的列表或集合类型 字符串 创建一个最简单的方法是什么 您可以指定要在字典的键上获得的比较类型 但我找不到列表的类似内容 假设您使用的是 NET 3 5 您可以使用 var strings new HashSet
  • 如何向 CRichEditCtrl 添加 Unicode 支持?

    我的应用程序曾经使用 MFC CEdit 控件 并且我们对宽字符 Unicode 字符串没有任何问题 切换到CRichEditCtrl后 似乎不再支持Unicode 汉字变成了 等等 我读过 CRichEditCtrl 在底层使用 Rich
  • 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?

    感谢您查看这个问题 的背景我有几台机器可以在很短的时间内连续生成多个 最多 300 个 PHP 控制台脚本 这些脚本运行速度很快 不到一秒 然后退出 所有这些脚本都需要对大型文件进行只读访问trie http en wikipedia or