-1

私はphp/mysqlを初めて使用するので、簡単なチャットアプリケーションを実装することにしました。ここにいくつかの特定の質問があります。


1)Facebookでは、チャットメッセージを送信すると、JavaScriptを使用してチャットログが更新されますが、接続が失われると、しばらくすると「配信に失敗しました」というマークが表示されます。私の質問は、AJAX / jqueryを使用してメッセージを送信する前にサーバーへの接続が確立されているかどうかを確認して、メッセージが配信されなかったことをユーザーに通知する方法です。


2)この単純化されたシナリオを考えてみましょう。チャットルームには2つのスロットがあります。つまり、チャットルームを共有していつでもチャットできるのは2人だけです。3人目のユーザーがログインしようとすると、次のように通知されます。チャットルームがいっぱいです。ユーザーのログインデータをセッション変数などとして保存できます。私の質問はこれです...2人がすでにチャットしていて、1人の人がログアウトなどせずにブラウザを閉じるだけの場合...その場合、セッション変数はまだ存在し、アプリケーションは2人がチャットしていると見なします部屋..ユーザーがブラウザウィンドウでアクティブでない場合にセッション変数を削除し、3人目の男が入るスペースを作るにはどうすればよいですか?


3)チャットアプリケーション(fbチャットやgoogleチャットなど)はどのようにチャットログを更新しますか?彼らはチャットログ全体(たとえば10個のメッセージで構成される)を要求しますか、それともAJAXを使用して現在のメッセージを要求するだけですか?そして、各リクエストの理想的な期間はどれくらいですか?私は1秒を使用しています...

4

2 に答える 2

1

ほとんどのチャットアプリケーションはajaxを使用していないと思います。ajaxの問題は、サーバーがクライアントに直接メッセージを送信するメカニズムがないことです。ajaxを使用した場合、各クライアントは一定の間隔でサーバーをチェックする必要があります。

この問題の解決策は、WebSocketまたは長時間のポーリングです。ラチェットをチェックしてください。これはphp用のWebSocketです。


ajaxの使用を主張する場合は、次のことができます。

  1. メッセージが保存されているdivに送信時にクラスを追加しますclass='ephemeral'。ajaxが失敗した場合$('.ephemeral').append('failed')
  2. これは、クライアントが切断された最後の5秒間にクライアントがサーバーにpingを実行しなかった場合に、ajax呼び出しでサーバーに常にpingを実行することで解決できます。
  3. 受信した最新のチャットメッセージの時刻をサーバーに送信し、それ以降のチャットのみをデータベースから取得することができます。これには、各チャットを個別の行としてデータベースに保存する必要があります。
于 2012-12-02T06:14:59.470 に答える
1

1)jqueryでは、ajaxコールバック関数がエラーが発生したかどうかを通知します。

$("#form").submit(function(){
    $.post("post.php", {
        message: $('#field').val(),
    }, function(data, status){
        alert("success");
    }).error(function(){
        alert(error);
    });
});

http://api.jquery.com/jQuery.post/を参照してください

2)サーバーを定期的に(毎分など)ポーリングできます。ユーザーがサーバーに接続しない場合は、onunloadが起動されたときにセッションを破棄するか、サーバーに切断コマンドを送信します(信頼性は低くなります)。

3)サーバーに最後の画像のタイムスタンプまたはIDを送信すると、それ以降のすべてのメッセージが返送されます。

それはあなたがあなたのチャットをどれだけ「リアルタイム」にしたいかによります。1秒から10秒が理想的です。

于 2012-12-02T06:22:41.853 に答える