应用程序的进度条

Progress bar for an application

我用我的 Windows 服务器实现了一个 SAAS 场景:用户可以在 a website 中上传文件,然后 Fetch.exe 是一个编码为 in C# 的应用程序托管在服务器,Fetch.exe 将上传的文件作为输入,执行并生成输出以供用户下载。

所以在我的 php 中,我使用 exec 来包装 Fetch.exe:

exec("Fetch.exe " . $inputFile . " > " . $outputFile)

上传和执行(即Fetch.exe)可能需要几秒钟以上,我想向用户展示它正在处理并且一切正常。

我找到了一些讨论如何显示上传进度条的帖子。然而,有谁知道我可以做些什么来显示 Fetch.exe 的大致进度?我是否必须将其拆分为更小的应用程序并使用多个 exec?

您可以为 Fetch.exe 提供来自 php 的随机生成的 ID,例如来自 uniqueid 函数。 Fetch.exe 将创建一个名为 <uniqueid>.txt 的文件,其中包含进度百分比。从浏览器中,您可以调用具有该唯一 ID 的另一个脚本来获取该 .txt 文件的内容。按照顺序,它将是这样的:

  • 用户上传文件到PHP
  • PHP:
    • 处理上传的文件
    • 创建一个唯一 ID
    • 以文件和唯一 ID
    • 开始 Fetch.exe
    • returns 嵌入了 uniqueID 的页面

以下并行发生:

  • Fetch.exe 创建一个名为 /progress/uniqueid.txt 的文本文件,名称为 uniqueid。它将进度记录到其中。
  • 浏览器对 http://example.com/progress/uniqueid.txt 进行 AJAX 调用并向用户显示进度

最后,当进度达到 100% 时,浏览器将下载文件。您唯一可能想要添加的是一段时间后对进度文件的修剪。假设您每小时删除所有超过 10 分钟的文件。

您的 PHP 程序需要一种了解子进程(Fetch.exe 应用程序)状态的方法,因此,Fetch.exe 需要发送有关处理状态的信息,最执行此操作的自然方法是通过标准输出(标准输出是当您从 cmd 运行 时提供程序的信息)。

了解这一点,您可以 运行 并继续阅读 subprocess output from php using popen()

然后,您可以使用 PHP ob_flush() and flush() with the onmessage javascript event to establish the comunication from your client page with your running php script, here 您可以找到有关如何执行此操作的很好的教程。