8

PHP/MySQL/Javascript ベースのオンライン チェス ゲームに取り組んでいます。私が遭遇した問題の 1 つは、一方のユーザーがブラウザーを閉じただけである可能性です。誰かがページをアイドル状態/閉じているかどうかを確実に検出する方法はありますか?

さらに厄介なことに、私たちの学校のサーバーは cron ジョブをサポートしていません ---

4

3 に答える 3

2

これを行うための唯一の信頼できる方法は、他のコメント投稿者が示唆しているように、サーバーへの ping 手法を使用することです。このようにして、ブラウザではなくゲームを制御します。ユーザーを「追跡」する必要がある方法は、AJAX 呼び出しを開始することです...5 秒ごとで十分だと思います...サーバーに対して。これが行うことは、「追跡」テーブルに何かを挿入するか、「ゲーム」テーブルに作成した新しい列を更新して、ユーザーが最後にサーバーアクティビティを行った時間を追跡することです(ゲームの通常の動きは無視します...過度のチェックを避けるために、通常の移動に対してこれと同じプロセスを実行し、ping の間隔をリセットすることもできます)。したがって、ユーザーが移動するたびに (またはサーバーとの対話を必要とする何か)、対戦相手の時間をチェックする必要があります。s の最後のサーバー アクティビティ - 対戦相手が現在の時刻から 7 秒以内に移動しなかった場合、対戦相手のブラウザーは (何らかの理由で) 通信を停止しています。私が 7 秒と言った理由は、サーバー/データベース通信のために行われる余分な処理と、考えられるネットワーク遅延のためです。ネットワークの遅延がおそらくボトルネックであるため、この値を 10 程度に増やすことをお勧めします。

于 2012-12-08T09:26:45.570 に答える
1

クライアントが閉じているかどうかを正確に知ることはできません。限定的な推測を行うことはできますが、決して信頼できるものではありません。

クライアント セッションがアクティブかどうかを確認することに満足している構成を見つけることができるでしょうか?

ローテクな解決策は、セッション ID (または自作の一意の識別文字列) をタイムスタンプと共に保存することです。クライアントが新しいリクエスト (新しいページの読み込みおよび/または AJAX を使用) を行うたびに、タイムスタンプを更新します。

cronjobs へのアクセス権がないため、別の妥協が必要です。他の訪問者に、クライアントがまだアクティブであるかどうかを知らせてもらいます。訪問者がページをロードするたびに、セッション ID とタイムスタンプを保存するテーブルを調べて、アクティブであると考えられるセッションよりも古いセッションがないかどうかを確認します。

それはあなたの正確な問題に対する解決策ではありません(実行できないため)が、ローテクな妥協です。

于 2012-12-08T09:29:13.200 に答える
0

そのページで「RECURSIVE」 ajaxスクリプトを設定するだけで、そのスクリプトは短い時間の後に更新された時間をサーバーにサイレントに送信します。そして、サーバー上で、この詳細をログに記録するために、その要求リスナースクリプトを作成する必要があります。ユーザーのリクエストが停止している、またはリクエストが最後まで届かない場合は、ブラウザを閉じています。

于 2012-12-08T09:53:05.843 に答える