我已经使用我的Windows服务器实现了SAAS方案:用户可以在a website上传文件,然后Fetch.exe
是在服务器中托管的in C#
应用程序{{1}将上传的文件作为输入,执行并生成输出以供用户下载。
所以在我的php中,我使用Fetch.exe
来包装exec
:
Fetch.exe
上传和执行(即exec("Fetch.exe " . $inputFile . " > " . $outputFile)
)可能需要几秒钟的时间,我想向用户显示它正在处理,一切都很顺利。
我找到了一些讨论如何显示上传进度条的线程。然而,是否有人知道我可以做些什么来显示Fetch.exe
的大致进展?我是否必须将其拆分为较小的应用程序并使用多个Fetch.exe
?
答案 0 :(得分:2)
您可以为Fetch.exe
提供来自php的随机生成的ID,例如来自uniqueid
函数。 Fetch.exe将创建一个名为<uniqueid>.txt
的文件,其中包含进度百分比。在浏览器中,您可以使用该唯一ID调用另一个脚本来获取该.txt文件的内容。按顺序,它将是这样的:
以下并行发生:
/progress/uniqueid.txt
的文本文件,其唯一ID为名称。它将进度记录到其中。http://example.com/progress/uniqueid.txt
进行AJAX调用并向用户显示进度最后,当进度达到100%时,浏览器会下载文件。您可能想要添加的唯一内容是在一段时间后修剪进度文件。假设您每小时删除超过10分钟的所有文件。
答案 1 :(得分:1)
你的PHP程序需要一种方法来了解子进程的状态(Fetch.exe应用程序),因此,Fetch.exe需要发送有关处理状态的信息,最自然的方法是通过标准输出(标准输出是从cmd运行时提供程序的信息)。
了解这一点,您可以运行并继续阅读subprocess output from php using popen()。
而且,您可以使用PHP ob_flush()和flush()与onmessage javascript event一起使用正在运行的php脚本从您的客户端页面建立通信,here即可找到一个关于如何做的好教程。