1

だから私は自分のサイトでどのユーザーがオンラインであるかを示すテーブルを作成しようとしています。誰かが最初にログアウトせずにサイトを閉じた場合、ログインしたままテーブルにとどまる部分を除いて、すべてが機能しています。私の状況を説明しようとします私ができる最高の。

online私のデータベースには、ログイン時にonlineステータスが1に設定され、ログアウトをクリックすると0に設定されたユーザーテーブルがあります。onlineこれは、誰かが10分間非アクティブになった場合に、使用しようとしているコードです。ログアウト(online0に設定)

<?php
session_start();
$timeout = 10; // Set timeout minutes
$logout_redirect_url = "logout.php"; // Set logout URL

$timeout = $timeout * 60; // Converts minutes to seconds
if (isset($_SESSION['last_activity'])) {
    $elapsed_time = time() - $_SESSION['last_activity'];
    if ($elapsed_time >= $timeout) {
        mysql_query("UPDATE users SET online = 0 WHERE username = '".$_SESSION['username']."'")
        or die(mysql_error());
        session_destroy();
        header("Location: $logout_redirect_url");
    }
}
$_SESSION['last_activity'] = time();
?>

これは正常に機能し、10分間待つとログアウトしますが、ブラウザを閉じるだけでonline= 1のままになり、リストに表示されます。

問題は、ユーザーを更新しonlineて0に設定する前に、セッションを破棄するブラウザーを閉じることです。

とにかくこれの周りにありますか?助けていただければ幸いです:)

ところで、私はもうmysqlを使用しないことを知っており、すべてを理解し、最初にすべてを機能させるようになったら、別のものに切り替えようとします。

4

1 に答える 1

1

根本的な問題は、ユーザーがブラウザを閉じたときに、最初にサーバーと通信するための信頼できる方法がないことです。[試すことができることはいくつかありますが、私の意見では、それは下がってはいけないうさぎの穴です]あなたが本当に「知っている」のは、ユーザーがログインしたサイトに最近アクセスしたことだけです。(あなたの場合$_SESSION['last_activity'])。

基本的なレベルでは、データベースにその情報を保持し始めてから、古いセッションをクリーンアップするためのプロセスをときどき開始する必要があります。

例えば

//On page load with a logged-in user
mysql_query("UPDATE `users`
             SET `last_activity` = '" . time() . "' 
             WHERE `username` = '" . mysql_real_escape_string($_SESSION['username']) . "'");

INTテーブルに次の名前の列を追加したことを前提としていることに注意してくださいlast_activity

次に、たとえば15分ごとに実行されるプロセスで:

mysql_query("UPDATE `users` 
             SET `online` = 0 
             WHERE `last_activity` < '" . strtotime('-30 minutes') . "'");

Unixサーバーには、特に期間タスク/スクリプト用にcronと呼ばれるものがあるため、クリーンアップスクリプトを開始するためにこれをお勧めします。

于 2013-01-06T04:56:33.027 に答える