将 PHP 调用的 .exe 程序(作为单独的进程,而不是在 PHP 中运行)的输出发送回 iPhone 客户端的可能方法

Posted

技术标签:

【中文标题】将 PHP 调用的 .exe 程序(作为单独的进程,而不是在 PHP 中运行)的输出发送回 iPhone 客户端的可能方法【英文标题】:Possible methods to send the output of a PHP-invoked .exe program (that runs as a separate process, not in PHP) back to the iPhone client 【发布时间】:2010-01-07 16:02:53 【问题描述】:

我的 iPhone 客户端应用程序将数据上传到在 php 上运行的服务器。有一个代码可以在 PHP 的服务器端调用 .exe 程序。 .exe 程序将获取上传的数据并在自己的进程上运行。这意味着 PHP 执行将在不等待 .exe 程序完成的情况下结束。在 .exe 程序处理完上传的数据并有输出后,我希望将这个输出发送回 iPhone。

通常,如果我们调用 .exe 程序在 php 中运行而不使其成为一个单独的进程,我们必须等待程序完成,然后才能将输出发送回 iPhone 客户端。

通过将 .exe 程序作为单独的进程运行,不可能通过调用 .exe 程序的 PHP 将数据发回。问题是,如果我们让 .exe 程序在单独的进程而不是 PHP 脚本上运行,那么将输出发送回 iPhone 客户端的可能方法是什么?

【问题讨论】:

【参考方案1】:

这是您概述的需求问题。让我解释几个想法。

首先,如果您终止初始上传请求,检查它是否已完成的唯一合理方法是每隔几秒钟从 iPhone 轮询一次。每 5 秒向“get-update.php”发送一个请求,查看是否有数据。

通过使用 $_SESSION,您应该能够存储一个令牌,该令牌将在数据处理完成后识别数据。

关于实际过程,您可以通过多种方式来实现。一种是做一个相当标准的双叉,将子进程与父进程分离,这样在父进程退出后它会继续。

另一个(推荐)是创建一个后端服务器进程,该进程将监视您的数据库中的请求、获取它们、处理它们并更新数据库。所以当初始上传脚本实际上传数据时,让PHP将其放入数据库,将记录ID存储在$_SESSION中,然后返回给用户。

后端进程会注意到有一条记录要处理,读取数据,调用可执行文件,并用结果更新数据库。

get-update.php 脚本将读取 $_SESSION 的记录 id,并检查数据库是否已处理数据(或状态是什么)。

如果您没有能力运行后台进程,并且您受限于使用 PHP,您可以使用双叉魔法,并叉另一个 PHP 进程来执行数据库读取/exe/数据库更新。

如有问题,请随时发表评论。

您需要 (a) 一种将数据传递给程序的好方法,以及 (b) 一种取回数据的好方法。

【讨论】:

【参考方案2】:

我想说这是AJAX sn-p 经常从 .exe 写入其状态的文本文件中轮询数据的完美案例。

您调用的上传脚本可能会向上传客户端返回某种唯一标识符。使用该标识符,客户端将轮询 exe 的状态(例如,“输出文件 xyz 是否已经存在?”),直到它得到积极的反馈。

【讨论】:

【参考方案3】:

一旦断开连接,您将很难与 iPhone 重新连接。它可能不在覆盖范围内,它可能已经改变了IP地址,......

最好的办法是让 iPhone 重新连接到服务器并轮询它的信息。

【讨论】:

【参考方案4】:

您可以使用 Apple 的推送通知服务来做到这一点,但这可能有点过头了,除非您认为数据处理需要很长时间,并且/或者您想在处理完成后更新应用程序图标,甚至如果应用程序没有运行。

您希望用户只是耐心地等待结果,还是他们会触发数据,稍后再查看?如果只需要几秒钟,您可以在等待一段时间后让 iPhone 应用轮询结果(同时显示进度指示器)。

【讨论】:

以上是关于将 PHP 调用的 .exe 程序(作为单独的进程,而不是在 PHP 中运行)的输出发送回 iPhone 客户端的可能方法的主要内容,如果未能解决你的问题,请参考以下文章

MSI安装的数据持久性

ElectronJS应用程序将插件作为单独的进程加载

将 Pyqt GUI 主应用程序作为单独的非阻塞进程运行

将filewatcher作为单独的进程运行

qt调用外部exe程序并且将exe程序一起打包

如何找出CMD.exe进程在远程计算机上运行的脚本?