3

私はこのようなajaxチャットアプリケーションを作成して、毎秒メッセージをチェックして取得しました。そしてそれはうまくいきます。

  function get_messages(user_id) {
    $.ajax({
      type    : "POST",
      url     : "messages/get_messages", 
      cache   : false,
      data    : {
        user_id : user_id 
      },
      success : function(data) {
        if(data != '') {
          var obj = $.parseJSON(data);
          var messages = obj.messages;
        }
      }
    });
    setTimeout(function() { get_messages(user_id) }, 1000);
  }

私の質問は、多くの人が毎秒サーバーへのAjaxリクエストに対してこのアプリケーションを頻繁に使用する場合、このようにすることでパフォーマンスの問題やサーバーの問題が発生するかどうかです。これを行うためのベストプラクティスは何ですか?

貴重なご提案ありがとうございます:)

4

2 に答える 2

2

このようなチャットを行う最善の方法は、「チャット ウィンドウ」<iframe>をスクリプトへの永続的な接続として適切に表示することです。スクリプトは実行され続け、クライアントに新しいメッセージを提供します。これにより、AJAX でサーバーを圧倒する必要がなくなります。リクエスト。ob_flush()これは、 (念のため) を呼び出し、flush()新しいものを印刷した後に、クライアントが更新をすぐに受け取るようにすることで実現できます。ただし、最初にいくつかの設定を行って、PHP が適切に動作するように準備する必要があります。

ini_set('zlib.output_compression', 'off');
ini_set('output_buffering', 'off');
set_time_limit(0);

セッションを使用する場合は、同時書き込みを防ぐためにセッションがロックされていることを忘れないでください。必要な情報を収集した後、$_SESSION使用してセッションを解放する必要がありsession_write_close()ます。そうしないと、ユーザーはメッセージなどを投稿できなくなります。

また、スクリプトは非アクティブ状態をチェックし、チャット ウィンドウが数分以上アイドル状態のままである場合は、クライアントに何かを出力する必要があります。ブラウザによって接続が終了されるのを防ぎます。視覚的なものである必要はあり<!-- keep alive -->ません。

さて、どこから新しいメッセージを取得しますか? これを行うには、いくつかのオプションがあります。

  1. ソケット。このチャット サーバー アプリケーションをサーバー側で実行し、すべてのチャット ウィンドウ PHP スクリプトが接続して、新しいチャット ラインをフィードすることができます。ユーザーが新しいメッセージを送信すると、チャット サーバーに送信され、チャット ウィンドウ スクリプトにブロードキャストされます。このチャット サーバーは、PHP でも安全に作成できます。

  2. ファイル。最も簡単な方法。すべてのチャット ウィンドウ PHP スクリプトは、この同じファイルを読み取り専用でfseek()最後まで開きます。!feof()そこから新しい行を読み取るために、1秒に数回チェックするループがあります。ユーザーが新しいメッセージを送信すると、このメッセージをファイルに追加するだけで、トリックは完了です。

  3. SQL。すべてのチャット ウィンドウ PHP スクリプトは RDBMS への新しい接続を開き、最終的には制限に達するため、お勧めしませんが、RDBMS を使用しない SQLite を試すことができます。

于 2013-03-14T04:37:29.993 に答える
1

このタスクに通常のAjax/Phpを使用することはお勧めできません。あなたが言ったように、ユーザーがたくさんいる場合、各ユーザーは毎秒データベースにクエリを実行します。

これにより、サーバーに過度の過負荷がかかり、ユーザーは相互にリアルタイムで通信できなくなります。

このタスクにはnode.jsを使用することをお勧めします。クロスブラウザ互換にするには、socket.ioであるnode.jsのフレームワークを使用する必要があります

したがって、最終的な判断は、node.jsを使用します

node.jshttp://www.nodebeginner.org/を学ぶことができ ます

Webには非常に優れたチュートリアルがあります。lynda.comには、node.jsに関する非常に優れたチュートリアルもあります。

于 2013-03-14T05:11:39.977 に答える