在我基于 Rails 的网站上,我希望用户能够输入一个 URL,我的服务器使用wget
带有 recursive 选项的 Unix 命令下载该 URL 。然后,我的服务器会压缩这些下载的文件以及服务器上已有的一些文件,并使用 Rails 命令将压缩文件发送给用户send_file
。
现在,我担心send_file
会在wget
压缩完成之前执行。如何确保仅在下载和压缩完成后发送文件?这种方法行得通,还是我应该采取另一种方法?
在我基于 Rails 的网站上,我希望用户能够输入一个 URL,我的服务器使用wget
带有 recursive 选项的 Unix 命令下载该 URL 。然后,我的服务器会压缩这些下载的文件以及服务器上已有的一些文件,并使用 Rails 命令将压缩文件发送给用户send_file
。
现在,我担心send_file
会在wget
压缩完成之前执行。如何确保仅在下载和压缩完成后发送文件?这种方法行得通,还是我应该采取另一种方法?
您如何在应用程序中与 wget 交互。如果你使用 ruby 的反引号或类似的,它应该等到命令退出
def some_action
# some magic
out = `wget ....`
# zip
send_file #...
end
您最好将下载任务卸载到工作线程(或服务),并在下载准备好时通知用户。
如果你想变得非常优雅,你可以在你的布局(/view/partial/etc)中有一些javascript定期检查是否完成,然后通知用户/提供下载选项。
您要卸载的原因是以下任何一种都会导致您的进程失败:
卸载允许您将请求排队,这样您就可以有效地管理同时下载和处理任务的数量。如果下载是由用户操作直接启动的,那么如果几个/许多人同时开始请求所有文件,您最好希望您的应用服务器能够处理负载。向您的操作系统发起工作会导致内存/资源使用量猛增,因为您必须为每个进程将单独的 shell 加载到内存中。