Non dovrei aiutarti perché sono di un paese rivale storico del tuo (e già dovresti aver capito di dove sono), ma sono anche una brava persona, quindi te lo dico
Una gestione semplice potrebbe essere la seguente.
Crei sul db una tabella con id utente e timestamp per l'ultima azione effettuata.
In pratica quando un utente effettua il login va registrato in sessione l'accesso e contestualmente va anche registrato sul db assieme ad un timestamp, ogni volta che l'utente fa qualcosa andrà aggiornato il timestamp relativo alla entry dell'utente all'interno della tabella.
Se l'utente effettua il logout, elimini anche la sua entry dalla tabella.
In questo modo c'è sempre il timestamp dell'ultima attività dell'utente.
La funzione per gli utenti online sarà semplicissima:
- per prima cosa cancella tutte le entry più vecchie di tot (a tua scelta) minuti (non secondi, un utente può stare qualche minuto su una pagina a leggere senza fare altro) in modo da eliminare gli utenti inattivi da lungo tempo e che presumibilmente non sono più online.
- legge le entry rimaste che corrispondono agli utenti presumibilmente attivi
- mostra tali utenti come attivi
Ovviamente cancellando un utente dalla tabella, non devi toglierlo anche dalla sessione, perché magari hai impostato 10 minuti per definire l'inattività e tale utente sta solo leggendo qualcosa che gli sta richiedendo più tempo e quindi non deve ritrovarsi buttato fuori, perché in realtà è ancora lì.
Un utente non "sloggato", che però è stato dichiarato "inattivo" e quindi eliminato dalla tabella, quando effettua una nuova azione, deve essere reinserito nella tabella degli attivi anche senza dover rifare il login.
In pratica la funzione che aggiorna il timestamp deve prima verificare se esiste già una entry per l'utente, se esiste l'aggiorna, se non esiste la crea.