Non si può fare affidamento alla semplice sessione per decidere se un utente è online oppure no.
Devi gestire la sessione tramite database, ovvero farti una tabella in cui vengano inseriti gli utenti che fanno il login ed un timestamp.
Il timestamp va aggiornato ogni volta che un utente fa qualcosa, ad intervalli di tempo dovresti poi eliminare da questa tabella gli utenti con timestamp più vecchio di tot minuti (tot minuti che secondo te vogliono dire che l'utente non è più online).
Dovrai eliminare la entry dell'utente anche in caso esso faccia esplicitamente il logout.
Ovviamente in questo modo catturerai istantaneamente il fatto che l'utente non è più online solo se fa il logout, altrimenti avrai un certo ritardo (quello dei tot minuti di inattività).
Non c'è modo di avere riscontro immediato se non si fa il logout, anche qui su questo forum (e in qualsiasi altro) un utente che chiude il browser e non effettua il logout è considerato ancora online per un po' di tempo.