Utenti con il count degli account PHP

Ho difficoltà a capire come posso contare il numero di utenti loggati nella mia applicazione.

Cosa ho: quando un utente effettua l'accesso, ottiene una session (che viene utilizzata quando l'utente desidera visitare una pagina protetta) e la colonna IsLoggedIn per l'utente nella tabella utenti è impostata su 1 per indicare che l'utente è registrato in. Quando l'utente si disconnette, il valore viene reimpostato su 0. Il count del numero di 1 nella tabella utenti semplifica la restituzione del numero di utenti che hanno eseguito l'accesso. Ma…

Il problema: se l'utente chiude il browser senza disconnettersi, il valore nel database rimane 1, a indicare che l'utente è ancora connesso anche se la session è terminata alla chiusura del browser.

Domanda: Qualcuno potrebbe suggerire un modo corretto per farlo?

Piuttosto che una colonna IsLoggedIn, devi aggiungere una colonna LastTimeSeen. Ogni volta che una persona visita una pagina, aggiorni la colonna:

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

Quindi per get quante persone ci sono sul sito in qualsiasi momento, usi la query:

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

Ciò dimostra quante persone hanno visto una pagina negli ultimi 5 minuti, che è la migliore che otternetworking senza una soluzione molto più complicata.

Solo per offrire un'altra soluzione:

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

Se non è necessario interrogare questi dati, un touch di file locale è molto più veloce di una scrittura DB. Per accedere agli utenti, eseguire la scansione della directory per i filemtimes sotto N secondi.

A causa del modo in cui è stato costruito il nostro sito, è stato necessario utilizzare l'approccio ajax. Sto usando jQuery quindi è relativamente indolore.

Queste righe sono entrate nella function $ (documento) .ready.

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

Questa è la function javascript …

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

Ed ecco il 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']}"); } ?> 

Il count è dritto 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]; 

Per quelle volte ho bisogno di aggiornare i numbers in modo dinamico, questo bit di ajax fa il trucco.

 $.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"); } } }) 

usando questo per 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(arrays('total'=>$total,'online'=>$online)); echo($response); 

Funziona bene per noi.