2

RailsベースのWebサイトで、ユーザーがURLを入力できるようにしたいと思います。URLは、サーバーwget が再帰オプションを指定したUnixコマンドを使用してダウンロードします。次に、サーバーはダウンロードされたファイルをサーバー上に既に存在するいくつかのファイルと一緒にzipし、Railsコマンドを使用してzipをユーザーに送信しますsend_file

さて、とzipが仕事を終えるsend_file前に実行されるのではないかと心配しています。wgetダウンロードと圧縮が完了した後にのみファイルの送信が行われるようにするにはどうすればよいですか?このアプローチは機能しますか、それとも別のアプローチを取る必要がありますか?

4

2 に答える 2

2

アプリケーション内からwgetをどのように操作していますか。ルビーのバックティックなどを使用している場合は、コマンドが終了するまで待機する必要があります

def some_action
  # some magic
  out = `wget ....`
  # zip
  send_file #...
end
于 2012-11-01T21:36:01.747 に答える
2

ダウンロードタスクをワーカースレッド(またはサービス)にオフロードし、ダウンロードの準備ができたらユーザーに通知することをお勧めします。

本当にエレガントになりたい場合は、レイアウト(/ view / partial / etc)にJavaScriptを定期的にチェックして、ユーザーに通知し、ダウンロードオプションを提供することができます。

オフロードする理由は、次のいずれかであるため、プロセスが失敗します。

  • ブラウザのタイムアウト
  • ユーザーは、更新、戻るなどの破壊的なアクションを実行します。
  • サーバーwgetからの応答が遅い/失敗しました(クライアントが待機している場合、失敗時にどのように再試行しますか?)
  • その他のエラー状態(ディスクがいっぱいですか?ファイル名が重複していますか?zipでエラーが発生しましたか?)

オフロードを使用すると、リクエストをキューに入れることができるため、ダウンロードと処理の同時タスクの数を効果的に管理できます。ダウンロードがユーザーアクションによって直接開始される場合、複数/多数の人が一度にファイルを要求し始めた場合、アプリサーバーが負荷を処理できることを期待する方がよいでしょう。作業を行うためにOSにシェルアウトすると、プロセスごとに個別のシェルをメモリにロードする必要があるため、メモリ/リソースの使用量が急増します。

于 2012-11-01T21:48:07.567 に答える