应用程序的进度条
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 您可以找到有关如何执行此操作的很好的教程。
我用我的 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 您可以找到有关如何执行此操作的很好的教程。