4

アプリケーションにログインしているユーザーの数をカウントする方法がわかりません。

私が持っているもの:ユーザーがログインすると、セッション (ユーザーが保護されたページにアクセスしたいときに使用されます) が取得され、users テーブル内のユーザーの IsLoggedIn 列が 1 に設定され、ユーザーがログインしていることを示します。ユーザーがログアウトすると、値は 0 に戻されます。users テーブル内の 1 の数をカウントすると、ログインしているユーザーの数を簡単に返すことができます。しかし...

問題:ユーザーがログアウトせずにブラウザを閉じると、データベースの値は 1 のままになり、ブラウザを閉じたときにセッションが終了しても、ユーザーがまだログインしていることを示します。

質問:誰かがこれを行う適切な方法を提案できますか?

4

3 に答える 3

15

IsLoggedIn 列ではなく、LastTimeSeen 列を追加する必要があります。ユーザーがページにアクセスするたびに、列を更新します。

UPDATE members SET LastTimeSeen = NOW() WHERE id = $the_user_id

次に、特定の瞬間にサイトに何人の人がいるかを取得するには、次のクエリを使用します。

SELECT COUNT(*) FROM members WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)

これは、過去 5 分間に何人のユーザーがページを閲覧したかを示しています。これは、はるかに複雑なソリューションを使用せずに得られる最高のものです。

于 2010-10-23T02:36:11.240 に答える
4

別の解決策を提供するだけです:

if ($user->isLoggedIn()) {
  touch("/writable/path/loggedInUsers/" . $user->id);
}

このデータを照会する必要がない場合、ローカル ファイルへのタッチは DB 書き込みよりもはるかに高速です。ログインしているユーザーを取得するには、ディレクトリをスキャンして、N 秒未満の filemtimes を探します。

于 2010-10-23T02:54:19.293 に答える
1

私たちのサイトの構築方法のために、ajax アプローチを使用する必要がありました。私はjQueryを使用しているので、比較的簡単です。

これらの行は $(document).ready 関数に入りました。

fnShowImOnline();
setInterval('fnShowImOnline', 120000);

これはJavaScript関数です...

function fnShowImOnline() {
    $.get('ajax/im_online.php');
}

そして、ここにPHPがあります

<?php
    session_start();
    if ((isset($_SESSION['user']))&&($_SESSION['authorized']=='authorized')) {
        include('../includes/db.php');
        db_connect();
        mysql_query("UPDATE members SET last_checked_in = NOW() WHERE user_id = {$_SESSION['user']['user_id']}");
    }

?>

カウントは単純な PHP/mySQL です。

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members where last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];

数値を動的に更新する必要がある場合は、この少しの ajax が役に立ちます。

$.ajax({
    url: 'ajax/members_online.php',
    dataType: 'json',
    success: function(response) {
        if (!isNaN(response.total)) {
            $('#OnlineTotal').html(response.total + " Total ");
            $('#OnlineOnline').html(response.online +  " Online Now");
        }
    }
})

これを PHP/mySQL に使用する

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members WHERE last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];
//  Members total.
$total_sql = "SELECT COUNT(*) FROM members";
$total_RS = mysql_query($total_sql);
$total_row = mysql_fetch_row($total_RS);
$total = $total_row[0];
$response = json_encode(array('total'=>$total,'online'=>$online));
echo($response);

これは私たちにとってうまく機能しています。

于 2011-11-17T19:26:23.313 に答える