0

Prawn を使用する場合、レンダリング/ビルド プロセスの前にファイル ストリームを開始する例はありますか?

状況としては、自分のワークステーションで実行するのに約 60 秒かかる 350 ページ程度のレポートがありますが、それを実稼働環境 (EC2) に移動すると、レポートの実行時間が 300 秒を超え、レポートが終了するときにPDF をブラウザに送信しません。

ユーザーからのフィードバックがなければ 60 秒でも長いですが、300 秒は待っても機能しません。私が探していたのは、レンダリング プロセスの前にファイルのダウンロードを開始することです (私は Prawnto でこれに .pdf.prawn ビューを使用しています)。これにより、少なくともユーザーは処理中に何かが起こっていることを確認できますが、これまでのところ、これを行うことができませんでした。私が見つけたすべての例とガイドは、レンダリングが終了した後、長い間待機した後にダウンロードを開始します。

他のすべてが失敗した場合は、レポートのスケジュールを検討しますが、理想的には、ユーザーがレポートを表示し、戻って変更を加えてから再度実行できるようにすることをお勧めします。これでは、スケジュールが明らかに許可されません。

Prawnto で表示するコードはそれほど多くありません。これは、ビュー内のすべてが PDF レイアウトであり、コントローラーで this を介して呼び出されるためです。send_file を試し、PDF レイアウトをコントローラーに移動して Prawnto なしで実行しましたが、すべての変更で同じ結果が得られたようです。PDF は長時間待機した後にブラウザーに送信されます。

現時点ではアイデアがありません。アイデアをいただければ幸いです。

 respond_to do |format|
  format.pdf {
    prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false
    render :layout => false
  }
4

1 に答える 1

2

PDF の生成に 60 秒以上かかる場合は、バックグラウンド ワーカーへのオフロードを検討する必要があります。Delayed::Job または Resque を使用することをお勧めします。

ワーカーに PDF を作成してディスクに保存してもらいます。PDF をダウンロードする準備ができていることを示すフラグを (データベースなどに) スローします。

これにより、アプリがさらに複雑になりますが、ユーザーエクスペリエンスは大幅に向上し、説明した「PDF をダウンロードできない」という問題は発生しません。また、アプリの使用頻度が高い場合は、PDF 作成ワーカーを別のサーバーに簡単にオフロードできます。

于 2011-03-23T12:38:52.343 に答える