Il modo in cui lo faccio è eseguire periodicamente il ping di un gestore speciale utilizzando AJAX (una volta ogni 30 secondi). Sono un sacco di richieste, quindi invece di aggiornare la tabella degli utenti online ogni volta con l'ultima visita, sto aggiornando memcache. Aggiornerò il record del database solo quando sono 5 minuti indietro rispetto al record memcache (puoi scegliere un ritardo maggiore o minore a seconda del carico). Quindi un processo cron rimuove i record non aggiornati dalla tabella degli utenti online.
Per verificare se un utente specifico è online, controllo semplicemente il suo record di memcache. L'errore non supera mai i 30 secondi. Il database non è mai indietro di più di 5 minuti, quindi anche i risultati del database sono piuttosto accurati.
Uso queste richieste periodiche anche per inviare eventi all'utente.