Sposób, w jaki to robię, to okresowe pingowanie specjalnego programu obsługi za pomocą AJAX (raz na 30 sekund). To całe mnóstwo próśb, więc zamiast aktualizować tabelę użytkowników online za każdym razem przy ostatniej wizycie, aktualizuję memcache. Aktualizuję rekord bazy danych tylko wtedy, gdy jest 5 minut za rekordem memcache (możesz wybrać większe lub mniejsze opóźnienie w zależności od obciążenia). Następnie zadanie cron usuwa nieaktualne rekordy z tabeli użytkowników online.
Aby sprawdzić, czy konkretny użytkownik jest online, po prostu sprawdzam jego rekord memcache. Błąd nigdy nie przekracza 30 sekund. Baza danych nigdy nie jest opóźniona o więcej niż 5 minut, więc wyniki z bazy danych są również dość dokładne.
Korzystam również z tych okresowych próśb, aby przekazać zdarzenia użytkownikowi.