3

重複の可能性:
PHPの長いスクリプトの進行状況を表示する

リクエストに応じて大きなPDFドキュメントを生成するPHPスクリプトがあります。これには通常約1〜2分かかります。ユーザーに完了を知らせる唯一の方法は、プロセス全体が完了したときにメールを送信することです。

ファイルの生成中に、ある種のプログレスバーをユーザーに表示させたいのですが。このタスクに取り組むための最良の方法は何ですか?私の頭に浮かぶ唯一のことは、PDF生成スクリプトがデータベースにデータを保存する必要があることです(私はすでにプロジェクトでMySQLを使用しています)。クライアント側では、この進行状況データをポーリングするAjaxリクエストを含めることができます。 5秒ごとに、ユーザーに表示します。したがって、おそらく2つのAjaxリクエストがあります。1つはPDF生成スクリプトを起動するためのもので、もう1つはユーザーが進行状況を確認するためのものです。

私はこの方法でそれを行うことができると思いますが、私がおそらく知らない標準的な方法はありますか?

4

3 に答える 3

4

あなたの提案するアプローチ:

...おそらく最も簡単で、既知の理由で歩くので、簡単に処理およびデバッグできます。

これに、PDF生成を開始するajax呼び出しの代わりにfork / exec/passthroughを使用できることを追加することしかできません。

よりエレガントな(読むべき:複雑な)アプローチ:

PHP Gearmanは、PHP通信ライブラリを備えたマシンで実行できるスタンドアロンサーバーです。

Gearmanデーモンを実行し、作業するタスクを与えて、プログレスバーのデータベースにデータを書き込むことができます。この設定の利点は、fork / exec / passthroughがコストのかかる操作であるということです。デーモンであるGearmanはすでにオンになっているため、PHPワーカーへのexec呼び出しを処理し、トリガースクリプトが短時間で動作する必要があります。

特定のワーカーの状態についてGearmanに問い合わせて、カクテルにデータベースを追加しないようにする通信APIがあるかどうかはわかりません。

于 2012-08-02T16:13:12.103 に答える
2

完了するまでに非常に長い時間がかかるプロセスでは、データベースをポーリングするためにajaxを使用するというあなたの提案は、おそらく仕事を成し遂げるための最も簡単な方法だと思います。

私が見る他の唯一の選択肢は、最初のリクエスト(実際のPDF生成スクリプト)がバッファリングされていない出力を生成し、それをブラウザに直接パイプで戻すことができるかどうかです。ただし、これはPHPから何ができるかによって制限され、echoブラウザー/Webサーバーのタイムアウトについても心配する必要があります。

于 2012-08-02T16:04:31.330 に答える
0

PDFのコンテンツをデータベースに保存しないと、プログレスバーを表示できません。処理画像を使ってユーザーに処理を教えてみませんか。

于 2012-08-02T16:13:24.300 に答える