3

PHP/Ajax/MySQL で簡単なチャット アプリケーションを作成しました。

私は定期的にこれら2つのメソッドを呼び出しています-

setInterval("GetChatParticipants()",5000);
setInterval("GetChatMessages()",1000);

クライアントの設計により、[ログアウト] または [サインアウト] ボタンがないため、ユーザーがブラウザーを閉じたことを検出し、その時点でデータベースから参加者レコードを削除する必要があります。onbeforeunloadウィンドウのアンロードイベントでChromeがAjaxリクエストを受け入れることを拒否するため、使用したくありません。

そこで、リクエストを重ねてAjaxで実装しようと考えています。しかし、問題は、それをどのように正確に行うかです。Participant テーブルを更新し、last_active_time現在時刻との差last_active_timeが 10 分以上ある場合は、ユーザーを削除する必要がありますか? それは実用的な解決策ですか、それともより良い解決策がありますか?

4

3 に答える 3

1

はい、それは実用的な解決策です。唯一の違いは、ユーザーのpingに関する情報をどこに保存するかです。データベースまたはmemcachedのようなKey-Valueストレージでそれを行うことができます。必要なリソースが少ないと思うので、2番目のものを好みます。

于 2012-06-21T10:50:49.627 に答える
1

あなたは最高のソリューションIMOを持っています. Javascript で、そのブラウザ/セッションに固有のセッション ID を使用して、毎分 / 2 分などに ping を実行する「ping」機能を作成します。サーバーにセッション テーブルを用意し、ping を受信したら更新します。長期間 ping されていないエントリを検索し、セッションを閉じる別のスクリプトを作成します。

私はこの構造を 1 つのサイトで何千もの同時ユーザーに対して実行しており、負荷が重くなると (サイトの残りの部分を実行している間に 2 つの負荷分散されたサーバー上にあった)、ping を 1 分から 2 分ごとに下げ​​る必要がありました。それも)。明らかに、タイムアウト時間の約 45% で ping を実行します (したがって、1 つが失敗した場合、1 秒がヒットするはずです)。これは、負荷を処理できる単純なプロセスです。


編集:pingに「setInterval」を使用しないでください。ただし、各pingが返されるか失敗するときに「setTimeout」を使用します。それ以外の場合、setInterval を使用すると、サーバーの負荷が高くなりすぎると、ping がキューに入れられ、応答せず、さらにキューに入れられます。すべてのサーバーソケットが使用されているため、サーバーのメルトダウンが発生し、それを修正するためにsshで接続できません...私が誇りに思っていた瞬間ではありません.

于 2012-06-21T10:44:09.493 に答える
1

はい、それは実用的な解決策であり、信頼できるのは1つだけです。そのため、それに加えて他に何を使用しても、この最終チェックは常にロジックに含まれている必要があります. いくつかの方法を組み合わせることで、ユーザーの早期離脱を検出する可能性が高くなります。onbeforeunloadそれをサポートするブラウザーに追加します。安全でない場所から来るクライアントが、PC を離れるときにすぐにログアウトし、最後に非アクティブであることを確認したい場合に、「ログアウト」ボタンを追加します。

于 2012-06-21T10:41:53.950 に答える