1

setInterval(); の使用について質問があります。ジャバスクリプトで。私は病院の (PHP/SQL、Ajax) データベースを開発しています。現在、患者のテストが実行されるたびに、「(患者の名前) のテスト結果が更新されました」というメッセージがメイン画面に表示されるはずです。PHP スクリプトで実行しようとしましたが、PHP スクリプトから直接イベントをトリガーする方法がありませんでした。現在、この目的のために setInterval() を使用しています。これは、10 秒ごとに pateints データベースをチェックし、新しいテストが追加されたときにメッセージを表示する関数を実行します。

   setInterval(checkAndDisplayNewResults(), 10000);

私の質問は、「それは正しい方法ですか?サーバーまたはクライアント PC に過負荷をかけませんか?それが正しい方法ではない場合、代替手段は何ですか?

4

8 に答える 8

5

永遠に 10 秒ごとにサーバーをポーリングすることは、ほとんどの場合、更新を取得する正しい方法ではありません。クライアントとサーバー、そしてネットワークの両方にとって、非常に非効率的です。ポーリング間隔をはるかに遅い時間間隔に戻すか、サーバー プッシュ ソリューションのようなよりスマートなものを実装する必要があります。

そのようなより効率的なソリューションの 1 つは、サーバーがデータを利用可能にするとすぐにデータを返す、長時間実行されるサーバー要求で構成されるCometです。

HTML5は、クライアントとサーバーが 2 つの間でソケットを開いて、必要に応じて自由にデータを送信できるようにするWebSocketインターフェイスも指定します。

于 2012-05-04T07:57:30.100 に答える
1

サーバーにさらに負荷がかかると思います。特に、さまざまな場所から多くの接続がある場合。Comet テクノロジーを使用すると、次のことが可能になります。

http://www.lightstreamer.com/

http://www.ape-project.org/

于 2012-05-04T07:57:12.813 に答える
0

jfriend00の答えを補完するために、私はあなたが望むことをするために使用するよりも別の解決策を探すことを提案しますsetInterval

setInterval何らかの理由で有害であると見なされます:

  • setIntervalエラーを無視します
  • setIntervalネットワーク遅延を気にしない
  • setInterval実行を保証するものではありません

詳細については、http://zetafleet.com/blog/why-i-consider-setinterval-harmfulを参照してください。

サーバーの更新をチェックするためにこの手法を使用する以外に選択肢がない場合は、次のようなコードの方が効率的です

var timer = null,
    delay = 1000;

function checkAndDisplayNewResults() {
    // do some work

    // when the work is finished, set a timer to call again the function
    timer = setTimeout( checkAndDisplayNewResults, delay );

    // the term "when the work is finished" means in this case, when your AJAX request is finished
    // and not simply at the end of the checkAndDisplayNewResults function
}

// call the function immediately
checkAndDisplayNewResults();

また、Josephが言ったように、この手法がアプリケーションにもたらす可能性のある帯域幅のオーバーヘッドに注意してください。

いずれにせよ、他の人が指摘しているように、これを行うには他のより良い方法があります:WebSocket、サーバー送信イベント、HTTPポーリング、AJAXプッシュ、長時間ロードiframeなど...Webに関するこの記事のイントロをチェックできますSocketshttp ://www.html5rocks.com/en/tutorials/websockets/basics/およびWebSocketsの使用方法について詳しくはこちらをご覧ください

于 2012-05-04T09:28:06.733 に答える
0

サーバーは10秒ごとに1つのリクエストを問題なく処理する必要がありますが、これは自明だと思います。

クライアントも問題はありません。ジョセフが言ったようにDOM要素を取り除くことだけを忘れないでください。そうしないとRAMがゆっくりといっぱいになります。

それはすべてあなたが持っているクライアントの数に要約されます。ウェブサーバーはかなり多くのリクエストを処理できることに注意してください。それを利用することを恐れないでください。しかし、クライアントの数については何も言及していません。

クライアントがたくさんいる場合、頭に浮かぶのはデータベースだけですが、そのクエリはどれくらい重いですか?結果をキャッシュする必要がありますか?多分5-10秒ごと?

AJAXを使用することがこれを達成するための最も簡単な方法である場合、私はそれを実行すると言います:)

于 2012-05-04T08:24:31.167 に答える
0

setInterval を使用する場合は、間隔を一度だけ設定してください。そうしないと、複数のインスタンスが取得される可能性があります。

Websockets を検索して、それが解決策になるかどうかを確認できます

于 2012-05-04T07:58:49.227 に答える
0

関数の動作によって異なりますが、10 秒間隔の場合はそうではない可能性が高くなります。ただし、おそらく次のように書く必要があります。

setInterval(checkAndDisplayNewResults, 10000);
于 2012-05-04T07:55:55.863 に答える
0

setInterval()コードを実行するだけなので、問題はありません。

問題は次のとおりです。

  1. HTTP リクエスト

    1 台の PC で 10 秒ごとにポーリングすることは問題ありません。しかし、複数の PC がサーバーをポーリングしている場合、帯域幅を消費するだけでなく、複数の要求のためにサーバーにオーバーヘッドが追加されます。病院全体に相当する PC が 10 秒ごとにサーバーを攻撃していると想像してください。

  2. ブラウザの DOM

    また、これがキオスク アプリケーションの場合は、DOM にロードするアイテムの数についても考慮する必要があります。空港の「フライト スケジュール画面」のように、リストに項目をどんどん追加していきます。これらの未使用のアイテムを削除しないと、メモリを消費します。

于 2012-05-04T07:57:20.460 に答える
-2

はい、これが正しい方法です。他に選択肢はありません。たとえば、Gmail は同じ手法を使用して新しいメールを表示します。

于 2012-05-04T07:57:08.323 に答える