allora io solitamente faccio così...

- ho una classe user che viene sempre caricata e mi serve per riconoscere gli utenti in base alle sessioni o altro, in questa classe nel costruttore di solito se voglio tracciare gli utenti online aggiungo una query tipo
Codice PHP:
"UPDATE utenti SET last_action = NOW() WHERE user_id = " $_SESSION["user_id"]; 
dando per scontato il fatto di avere un campo in formato timestamp "last_action" nella tabella utenti.
Con questi query ad ogni caricamento di una pagina viene aggiornata la data di ultima azione dell'utente loggato (se ti interessano anche gli anonimi devi fare una cosa simile tenendo traccia degli IP)

- quando voglio visualizzare il numero di utenti collegati faccio una query del tipo
Codice PHP:
"SELECT COUNT(*) AS totale_collegati FROM utenti WHERE last_action >= NOW() - {intervallo scelto in secondi} 
Spero di essermi spiegato...