Ich pinge regelmäßig einen speziellen Handler mit AJAX (einmal in 30 Sekunden). Das sind eine ganze Menge Anfragen, also aktualisiere ich Memcache, anstatt die Online-Benutzertabelle jedes Mal mit last-visit zu aktualisieren. Ich aktualisiere den Datenbankeintrag nur, wenn er 5 Minuten hinter dem Memcache-Eintrag liegt (Sie können je nach Auslastung eine größere oder kleinere Verzögerung auswählen). Dann entfernt ein Cron-Job veraltete Datensätze aus der Online-Benutzertabelle.
Um zu überprüfen, ob ein bestimmter Benutzer online ist, überprüfe ich einfach seinen Memcache-Eintrag. Der Fehler ist nie länger als 30 Sekunden. Die Datenbank liegt nie mehr als 5 Minuten zurück, daher sind die Ergebnisse aus der Datenbank auch ziemlich genau.
Ich verwende diese regelmäßigen Anfragen auch, um Ereignisse an den Benutzer weiterzuleiten.