1

ユーザーが「ログイン」および「ログアウト」できる小さな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;
        }
    }
}
4

2 に答える 2

2

私が通常行うことは、javascript (jQuery) を使用して php ファイルを呼び出し、データベースなどを更新することです。この質問はあなたの答えかもしれません:ユーザーがオンラインかどうかを判断する最も簡単な方法は何ですか? (PHP/MYSQL)

于 2012-02-12T03:05:17.300 に答える
1

ajax を使用して、ハートビート セッション変数を変更するスクリプトをハートビートし、すべてのスクリプトの先頭でこのチェックを行うことができます (関数に入れて、もちろん呼び出します)。

// it's been > 30 secs since last heartbeat
if((time() - $_SESSION['heartbeat']) > 30)
{
    logout();
}

編集: 次にページにアクセスしたときではなく、データベースにそのステータスを即座に反映させたい場合は、MySQL を使用する必要があります。データベースをチェックするために別のプログラム (Java プログラムなど) を使用せずに、私が考えることができる唯一のことは、これをすべてのページの上部に追加することです (もちろん呼び出される関数で):

mysql_query("UPDATE `users` SET `loggedin`=0 WHERE heartbeat<".time()-30);

これはすべてのユーザーを更新します。つまり、ログイン値の精度はページ ビューの頻度によって設定されます。

于 2012-02-12T03:05:19.287 に答える