【问题标题】:Call running program and get response in php调用正在运行的程序并在 php 中获得响应
【发布时间】:2014-07-30 20:25:29
【问题描述】:

我创建了一个需要用户输入的 c++ 程序。我想从 php 调用这个程序并在我的网页上使用程序的输出。 由于 c++ 程序需要花费大量时间来初始化,我想让它在后台运行并在调用时响应 php 脚本。然后 php 脚本应该获取输出并将其显示在我的页面上。 这个可以吗?

【问题讨论】:

    标签: php c++ daemon


    【解决方案1】:

    当然可以,但是您可能必须编写两个 C 或 C++ 程序,一个在后台运行,另一个在您每次需要一些信息时由您的 PHP 程序启动。虽然有可能想出一个只使用 PHP 的方案——我还没有深入研究它。无论哪种方式,我都会将术语“请求者”用于“请求信息”的进程(PHP 或 C),而“服务进程”则用于实际响应信息的进程。

    要在请求者和后台进程之间进行通信,您需要使用一些 IPC(进程间通信)机制。有很多选择。在这种情况下,命名管道听起来像是一个合理的解决方案,并且命名管道在大多数操作系统中都可用(以及在例如 Boost 库中进行抽象,以便在需要时提供更便携的解决方案)。

    所以,基本原则是:

    1. 后台服务进程已启动(在系统启动时自动)。
    2. 服务进程创建命名管道(在双向模式下,或两个管道,每个方向一个 - 我在下面使用一个管道 - 根据需要调整“输入管道”和“输出管道”)
    3. 需要时,请求者进程打开命名管道并发送请求消息。
    4. 服务进程发回带有请求信息的消息。
    5. 请求者关闭管道。
    6. 根据需要重复步骤 2-5。
    7. 后台进程关闭,并作为其中的一部分破坏命名管道(在系统关闭时自动)。

    当然,上述 7 个步骤中的每一个都有许多“小步骤”,但总的来说,这几乎就是您想要做的。

    【讨论】:

    • 谢谢!我对 IPC 机制进行了一些研究,我想我会尝试一下共享内存。该程序初始化了大约 600mb 的内存,从命名管道读取它可能太慢了。
    • 但可以肯定的是,您不会每次从 C++ 程序请求时都提供 600MB 的数据,而只是客户端实际请求的数据?并且只要数据在内存中(如果您的服务器中有足够的 RAM 并且不加载太多其他东西,则应该是这样)。共享内存更难使用,因为您需要处理读/写问题(例如,服务程序在您在客户端读取数据时更新数据)
    • 我认为你是对的。我以为我需要所有数据,但我只需要后台进程来处理需要所有数据的请求,然后共享结果数据。
    • 事实上,这就是大多数事情的工作方式——我相信例如 MySQL 使用命名管道来实现这一点(另外,如果您需要多个客户端 [在任何给定时间超过一个 Web 会话],如果你使用共享内存,它会变得更加混乱 - 除非共享内存只是一个不变的数据块,永远不会改变)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2016-01-23
    • 1970-01-01
    • 2016-04-23
    • 2015-10-07
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多