Sättet jag gör det är att regelbundet pinga en specialhanterare med AJAX (en gång i 30 sekunder). Det är en hel del förfrågningar, så istället för att uppdatera tabellen för onlineanvändare varje gång med senaste besök uppdaterar jag memcache. Jag uppdaterar endast databasposten när den är 5 minuter efter memcache-posten (du kan välja en större eller mindre fördröjning beroende på belastningen). Sedan tar ett cron-jobb bort inaktuella poster från onlineanvändartabellen.
För att kontrollera om en specifik användare är online kollar jag helt enkelt hans memcache-post. Felet är aldrig mer än 30 sekunder. Databasen är aldrig mer än 5 minuter efter, så resultaten från databasen är också ganska exakta.
Jag använder också dessa periodiska förfrågningar för att skicka händelser till användaren.