0

バックグラウンド:

  • 2つのページ(index.phpとscript.php)があります。
  • index.phpからscript.phpを呼び出すjQuery関数があります。
  • script.phpは大量のデータ処理を実行し、そのデータをindex.phpに返して、ユーザーに表示できるようにします。

問題:

  • script.phpの終了に時間がかかるため、index.phpがタイムアウトしているようです。script.phpは、データをindex.phpに返す前に、処理が完了するまでに最大4時間かかる場合があります。
  • index.phpがタイムアウトしていると私が言う理由は、それが更新されることはなく、script.phpが処理を停止した後でも、砂時計を置いてそこに座っているからです。
  • script.phpが正常に処理を終了することは確かです。b/c出力をログファイルにも書き込んでいて、すべてが処理されていることを確認します。
  • script.phpで処理するデータが少ない場合、index.phpは想定どおりに更新されます。
  • script.phpを呼び出すときに、index.php内の関数内にタイムアウト値を設定していません。

script.phpが終了するのを非常に長い間待った後、index.phpを更新する方が良いですか?私はFireFoxを使用していますが、FireFoxの問題でしょうか?

4

2 に答える 2

2

ajax 呼び出しの応答に 4 時間かかることを真剣に望んでいますか? これは、Web とブラウザーの通常の動作ではほとんど意味がありません。再設計を強くお勧めします。

つまり、jQuery の呼び出しには、http: //api.jquery.com/jQuery.ajax/$.ajax()で説明されているオプションとして設定できるタイムアウト値があります。ブラウザが 4 時間まで設定できるかどうかはわかりませんが、それでも適切に動作します。いずれにせよ、ブラウザ接続を 4 時間開いたままにしておく必要がある可能性は高くありません。一時的な問題が発生した場合、どうしますか? 最初からやり直します?これは良いデザインではありません。

再設計として私が提案するのは、問題をより短い ajax 呼び出しで満たすことができる小さな断片に分割することです。本当に 4 時間の操作が必要な場合は、1 回の ajax 呼び出しで操作を開始し、ブラウザーから数分ごとにポーリングして、ジョブがいつ完了したかを確認することをお勧めします。最終的に完了したら、結果を取得できます。これは、ajax 呼び出しとブラウザーが機能する通常の方法との互換性がはるかに高く、4 時間の間に一時的なインターネット障害が発生しても影響を受けません。

可能であれば、最初の ajax 呼び出しで操作にかかる時間の概算を返すこともできます。これにより、結果を待っているブラウザーで役立つ UI が提供される可能性があります。

可能性は次のとおりです。

ステップ 1. ジョブの開始を要求する ajax 呼び出しを送信します。ジョブ ID と、ジョブの推定時間に関する関連情報をすぐに受け取ります。

ステップ 2. ジョブの推定時間に基づいてポーリング間隔を計算します。見積もりが 4 時間で、見積もりが概して正確である場合は、タイマーを設定して 2 時間後にもう一度尋ねることができます。データを要求するときは、最初の ajax 呼び出しで返されたジョブ ID を送信します。

ステップ 3. 完了予定時刻に近づくと、ポーリング間隔をおそらく数分にまで狭めることができます。最終的に、データが完了したことを示すポーリング リクエストを受け取り、データが返されます。私がサーバーを設計していた場合、クライアントが何らかの理由で再度要求する必要がある場合に備えて、データをサーバーに一定期間キャッシュして、4 時間のプロセスを繰り返す必要がないようにします。


ああ、それから、サーバーの設計を変更して、定期的に要求されるものが 4 時間もかからないようにすることを考えます。ある種のバッチ方式 (たとえば、1 日に 2 回) で事前にビルドして事前にキャッシュするか、4 時間ではなく 1 分以内で一般的なクエリを満たすことができるように、スキーム全体をやり直す必要があります。

于 2013-03-14T03:11:41.527 に答える
0

「それを維持する」ためだけに、定期的に index.php に応答を返すことは可能でしょうか? そうでない場合は、おそらくスクリプトをいくつかの小さなスクリプトに分割し、上記の 4 時間ではなく、タイプごとに 1 時間単位で実行してください。

于 2013-03-14T03:11:27.093 に答える