ユーザーが「ログイン」および「ログアウト」できる小さなWebアプリケーションを作成しようとしています。私が現在問題を抱えているのは、クライアントがサーバーに一定の「ハートビート」またはメッセージを送信して、サーバーがまだアクティブであることを通知できるようにすることです。
これはもっと論理的な質問です。私がやりたいのは、phpにwhile(1)ループを設定して、n個のハートビートがスキップされたかどうかをチェックすることです。このループが進行している間もクライアントとサーバーが対話できるようにしたい(基本的に、サーバーが別個の「check_for_heartbeats」スレッドを持っているかのように動作するようにしたい)。
PHPを使用してこれをどのように達成しますか?現在、XAMPPを実行しています。どんな助けでも大歓迎です。
編集:明確にするために、私がやりたいのは、window.unloadイベントが発生しない場合(たとえば、クライアントがインターネットから切断された場合)でもブラウザーのクローズイベントをキャッチできるようにすることです。この場合、ハートビートを監視するスレッドを持つことが最も直感的な解決策のようですが、phpでそれを実現する方法はわかりません。
編集2:isLoggedIn()は、セッションブール変数($ _SESSION ['is_logged_in'))が設定されているかどうかを確認する単なるヘルパー関数です。
ファイナルの編集:わかりました。これで、コメントと応答が何を言っているのかが正確にわかりました。言い換えると、考えられる解決策は次のとおりです。サーバーに「ハートビート」を送信するJavascriptコードを用意します。サーバーは、これらのビートに関連付けられたタイムスタンプを追加します。これらのタイムスタンプを保持するようにデータベースを変更します。「タイムスタンプ」テーブル全体(「timestamp」属性を持つ「users」テーブルの可能性が高い)をクエリし、NOWと最後のタイムスタンプの差がしきい値より大きいかどうかを確認します。ユーザーがこのしきい値を超えた場合は「ログオフ」します。
唯一の問題は、ログインしているユーザーが1人だけの場合、またはすべてのユーザーが同時に接続を失った場合です。ただし、これらの場合、ユーザーが接続を失ったことを確認するために他のユーザーがそこにいることはありません。
これは複数の回答の組み合わせですが、クリスの回答が問題の大部分を処理していると思います。有益な貢献をしてくれたchrisとAlexLunixの両方に感謝します。:D
より良い説明のためのコードスニペットはここにあります
サーバ側:
function checkBeats()
{
while(isLoggedIn())
{
// it's been > 30 secs since last heartbeat
if((time() - $_SESSION['heartbeat']) > 30)
{
logout();
break;
}
}
}