10

ユーザーが正常にログインした後、login=trueをデータベースに保存します。しかし、ユーザーがログアウトボタンをクリックせずにブラウザを閉じてログアウトしたかどうかを確認するにはどうすればよいですか?また、10分間非アクティブになっているユーザーをログインページにリダイレクトするにはどうすればよいですか?

私はphpとmysqlを使用しています。どんな助けでもいただければ幸いです。

編集:私の質問が明確でない場合は申し訳ありません。ログインしているかどうかを保存するためにセッションを使用しました。しかし、今度は情報をデータベースに保存して、他のページにステータスを表示できるようにします。user1に3人の友達がいるとしましょう。user1は、すべての友達を表示するときに、友達がオンラインかオフラインかを知りたいと考えています。これが私が欲しいものです。何かアドバイスはありますか?

4

12 に答える 12

13

2017年の編集:最近の最善の策は、WebSocketを使用してページ/サイトのプレゼンスを追跡することです。


ユーザーがブラウザを閉じたり、PHPを使用してサイトから移動したりしたことを検出することはできません。また、JavaScriptの手法は、役に立たないことが保証されているわけではありません。

代わりに、最善の策は、各ユーザーの最後のアクティビティ時間を保存する可能性が最も高いです。

  • 'last_activity'の行に沿ってユーザーテーブルに列を作成します。
  • ユーザーがページをロードするたびに、last_activityを現在の時刻に更新します。
  • オンラインのユーザーのリストを取得するには、10/20/何分前よりも新しいlast_activity値を持つユーザーをデータベースに照会するだけです。
于 2009-05-20T13:50:39.487 に答える
8

ユーザーの各アクティビティのタイムスタンプを保存します。その時間が 10 分以上前の場合は、ログアウトを行います。

PHP では、次のようなことができます。

session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
    // initiate value
    $_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
    // last activity is more than 10 minutes ago
    session_destroy();
} else {
    // update last activity timestamp
    $_SESSION['LAST_ACTIVITY'] = time();
}

代わりに、データベースでも同じことができます。そこでは、「現在」オンラインになっているユーザーのリストを取得することもできます。

于 2009-05-20T13:56:11.877 に答える
2

ユーザーがブラウザを閉じたかどうかを検出できるかどうか疑問に思っています。JavaScript を使用すると多少はできますが、私はそれに依存しません (javascript は簡単に無効にできるため)。ただし、PHP はページを要求しているときにのみ実行されるため、PHP ではできません。ページが開いているときではありません。

安全のために、ユーザーの最後のアクティビティを追跡する必要があります。それが数分 (5/10) を過ぎている場合は、ユーザーがいなくなったと想定してください。ただし、彼が再び何かを行うと (たとえば 6 分後)、彼はオンラインに戻ります。

于 2009-05-20T13:54:41.053 に答える
1

「オンライン」のユーザーを追跡しようとしている場合は、個々のユーザーに対してセッションを使用することを検討し、データベースに login=true を保存して自分や他のユーザーにステータスを表示する代わりに、最後のアクティビティ時間を保存することを検討してください。ユーザー。オンライン ユーザーのリストを取得するときは、SQL クエリを作成して、過去 10 分以内に「last_activity」を持つユーザーのみを返します。

于 2009-05-20T13:51:52.137 に答える
0

login = trueをセッション変数に格納して、ユーザーがログインしているかどうかを確認することをお勧めします。これにより、ほとんどの問題が解決されます;)

于 2009-05-20T13:33:36.183 に答える
0

通常、このような情報はセッションに入れます。

$_SESSION['user'] = "A user name";

次に、ログアウトする場合は、次のようにします。

session_destroy();

ここでのセッションとチュートリアルに関する詳細情報。

于 2009-05-20T13:35:15.260 に答える
0

データベースに挿入する代わりに、セッションまたはCookieを使用しないのはなぜですか。setcookie()関数を使用してCookieを設定するか、セッションを有効にして値を保存することができます。

于 2009-05-20T13:36:09.953 に答える
0

セッションを使用してログインステータスを監視する方がよいでしょう。

セッションに関するこの情報を読む

于 2009-05-20T13:36:42.073 に答える
0

私の知る限り、人がブラウザ ウィンドウを閉じたとき (またはページを離れて別のページに移動したとき) を確認する方法はないため、他の人が上で提案したようにアクティビティを確認する必要があります。

于 2009-05-20T13:54:10.213 に答える
0

これは、「ceejayoz」が前に言ったことの拡張です。

ユーザーが定期的にサービスに ping を送信し、まだログインしていることを伝えます。最後の ping 時刻をセッションに保存します。最後の ping セッションが上記の時間よりも長い場合は、再度 ping を実行して、使用がまだ有効であることを伝えます。

ping を受信した時刻をデータベースに保存します。受信した最後の ping が > keeplive しきい値である場合、ユーザーがサイトを離れたと見なします。

以下は、最初にテストされていないサンプル コードです。「PING__FREQUENCY」を使用して、ユーザー アクティビティが last_activity 列を更新する頻度を制御できます。

define(PING_FREQUENCY,300); //5 mins
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) {
    stillLoggedIn(); //execute a function to tell that the user is still logged in
}

function stillLoggedIn() {
    //Do SQL update to mark the last activity time for the user
}
于 2009-05-20T16:10:22.420 に答える
0

あなたは方法の組み合わせでこれを行うことができます.せいぜい2つ、最後のアクティビティに悩まされているものと、jQueryを使用して非アクティブをチェックすることと組み合わせます.アイドル時間が確認されたら、ユーザーがオフラインであることを示すデータベース テーブルを更新する php ファイルへの ajax 呼び出しを行います。

以下から開始できます。

<script type="text/javascript">
idleTime = 0;
$(document).ready(function () {
//Increment the idle time counter every minute.
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute

//Zero the idle timer on mouse movement.
$(this).mousemove(function (e) {
    idleTime = 0;
});
$(this).keypress(function (e) {
    idleTime = 0;
});
});

function timerIncrement() {
idleTime = idleTime + 1;
if (idleTime > 19) { // 20 minutes
    $.ajax({
     url: 'update_user.php',
     type: 'POST',
     datatype: 'json',
     data: someData
    });
}
}
</script>   
于 2014-06-22T13:45:27.463 に答える
0

私見の最善の方法は、ユーザー レコードが更新されるたびに最後のアクティビティのタイムスタンプを DB に保存することです。ログオフまたはタイムアウト (cronjob でタイムアウトを維持) の後、値をゼロに設定し、フラグとして使用します。

$user = new User($user_id);
$user->logged_in = (bool)($last_activity > 0);

時々あなたはsmthを言う必要があります. 「最後に見たのは...」のように、最後のアクティビティを残して、ブール値のフラグ (tinyint) Logged_in をユーザー テーブルに追加するだけです。

于 2009-05-20T16:23:56.743 に答える