web-dev-qa-db-ja.com

ユーザーがオンラインかどうかを判断する最も簡単な方法は何ですか? (PHP / MYSQL)

ユーザーがオンラインかどうかを知るためにセッションを便乗させる方法はありますか?

つまり、ログオンを使用し、$ _ SESSION変数を設定します。ユーザータイムアウトCookieガベージコレクターがデータベースを更新して、ステータスをオフラインに更新します。

EDIT:日時を含まないソリューションが必要です。セッションに乗るもの、またはそれに似たものが欲しい。誰かがオンラインであるかどうかを推測することは、私が必要とするものに対して十分ではありません。

38
MichaelICE

タイムゾーンの違いを理解することに煩わされないでください。それは必要ありません。

ユーザーがページにアクセスするたびに、Usersテーブルのレコードのフィールドをlast-updated-timeに更新します。次に、最後の5分以内に最終更新時刻を持っているすべてのユーザーに対してクエリを実行します。これ以上のものは、「オフライン」と見なされます。

MySQLのNOW()関数を介してサーバー時間を使用する場合、タイムゾーン間の差異を計算することを回避します。

これは、現在オンラインにいるユーザーの数を追跡する標準的な方法です(意味、最後の数分以内にアクティブです)。

常に更新

ページからページへジャンプしていなくてもアクティブのままであることを知りたい場合は、JavaScriptを少し含めて、60秒ごとにサーバーにpingを送信し、サーバーがまだ生きていることを知らせます。元の提案と同じように機能しますが、少なくとも5分に1回はサイトを必死に閲覧している必要はなく、レコードが更新されます。

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);
90
Sampson

あなたが求めていること(明確化の後)は、定義上、不可能です。 HTTPはコネクションレス型プロトコルであるため、ユーザーがページにアクセスしてすべてのコンテンツがサーバーからユーザーのブラウザーに戻るとすぐに、2つの間に接続はありません。誰かがあなたのウェブサイトを1秒足らずで「オンライン」にしています。

あなたができたことの1つは、WebページでJavaScriptにAJAXリクエストを定期的にサーバーに要求させることです識別情報を含む基礎と、ユーザーがページを離れるときに別のAJAXリクエスト、window.onbeforeunloadを使用)。

5
dj_segfault

私の方法は最善ではないかもしれませんが、私のサイトとユーザーベースはすべてmysql DBにあるため、ユーザーが私のサイトにログインすると、

  1. ユーザーテーブルを更新して、オンラインであることを伝えます
  2. それらをオンラインテーブルに挿入する
  3. 次に、現在の時刻でセッションを設定します

次に、ページを読み込むたびに、オンラインタイムセッションを確認します。存在する場合は、それがどれだけ古いかを確認します。5分未満の場合は何もしません。5分以上古い場合は何もせず、更新しますセッション時間を現在の時間で再度表示し、オンラインユーザーテーブルをその時間で更新する

次に、10分から15分ごとに実行されるcronジョブがあり、オンラインテーブルからすべての使用が削除され、X時間以内にオンライン時間が更新された場合、ユーザーテーブルがオフラインとしてマークされます

4
JasonDavis

「オンラインの人」の比較ロジックではタイムゾーンが考慮されていないようです。この方法でタイムゾーンを扱う場合は、すべての時間をGMTで保存し、表示する直前にユーザーの現地時間に変換することを強くお勧めします。これにより、比較操作が非常に簡単になります。

ニースSOタイムゾーンに関するスレッド here があります。

2
zombat

私がお勧めすることの1つは、この種の情報を、たとえばmemcachedまたはmysqlヒープまたはredisを使用してメモリに格納することです。それ以外の場合、データベースは非常にヒットします。

2
Alfred

タイムゾーンをテーブルに保存し、それを計算に使用して、ページを表示しているユーザーの現地時間と比較したユーザーの現地時間を見つけます。

編集:

さらに良いことに、すべての時間をサーバー時間として保存し、すべての計算はサーバー時間のみに基づいて行います。

1
Ian Elliott

このために実装したソリューションは、認証されたユーザーがページをロードするたびに、「user_ {userid} isonline "=> true」などのmemcache変数を設定/リセットし、5分後に期限切れにすることです。ユーザーの情報にアクセスするときに、varがキャッシュにあるかどうかを確認します。ユーザーベースのサイズによっては、オンラインで全員のリストを取得したい場合は、「userの配列でmemcache getmulti呼び出しを使用できます。 = {userid} _isonline "すべてのユーザーのキー。

もちろん、これは実際にユーザーがサイトのページを変更する頻度に依存します...オンラインでユーザーをより正確に表すために、短い間隔(30秒または30秒)で実行しているページにajax xmlhttprequest呼び出しを実装できます。そのため、memcache変数がリセットされ、memcache変数の有効期限が短くなります(ブラウザーの問題の可能性を考慮して1分)。これは完全には正確ではありませんが、httpはサーバーへの永続的な接続を持たないため、実行できることにはかなり制限があります。

オンラインである人の2番目までの表現が必要な場合は、Jabberサーバーに接続するページにフラッシュアプ​​リをロードし、その特定のユーザーがサーバーにログインしているかどうかを確認します。

0
Jason

状況に応じて、「ip」と「last-updated-time」の列を持つ「whose-online」という別のテーブルを作成し、ユーザーがページを読み込むたびにこのテーブルをクエリ/更新する方がよい場合があります。

ページ読み込み時のクエリに含まれる場合があります

  1. Ipに基づいて現在のユーザーの「whose-online」テーブルを更新/挿入します。
  2. 「期限切れ」の行を削除します(cronjobを使用して定期的に行うこともできます)。
  3. 「アクティブな」ユーザーをカウントします。

この手法を使用する利点

  1. ユーザーがログインしていない場合でも、そのユーザーは引き続きカウント/追跡されています。
  2. 所有しているユーザーの数によっては、このテーブルのクエリが高速になる場合があります。

注:これを使用する場合は、ページビューによってテーブルに行が作成されるため、ユーザーエージェントに基づいてボットを無視するか、人気のあるボット(Firefox、IE、Safari、Operaなど)のみをカウントできることを考慮する必要があります。

0
GiladG

onunloadタグを使用することもできます...本文について詳しくはこちら( https://www.w3schools.com/jsref/event_onunload.asp

これにより、ユーザーがオフラインになるまで4〜5分待つ必要がなくなります。

しかし、ユーザーのブラウザーがクラッシュした場合には、まだajax updateメソッドを使用する必要があります...

0
Raja Bilal

データベースから2つの日付の差を分単位で取得し、その差を確認してオンライン/オフラインのステータスを設定する方法を次に示します。

$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);

foreach($result as $user){
    // date from the database
    $dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
    // date now
    $now = date("d-m-Y h:i:s a", $date);

    // calculate the difference
    $difference = strtotime($now) - strtotime($dbLastActivity);
    $difference_in_minutes = $difference / 60;

    // check if difference is greater than five minutes
    if($difference_in_minutes < 5){
        // set online status
        $updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
    } else {
        // set offline status
        $updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
    }

    // check if mysqli query was successful
    if (!$mysqli->query($updateStatus)){
        printf("Error Message %s\n", $mysqli->error);
    }
} 
0
Syno