Generalmente onbeforeunload funziona se deve agire solo sul browser, ad esempio è usato da quelle pagine che ti mostrano il messaggio "Sei sicuro di voler abbandonare la pagina..." quando provi a chiuderla.
Il problema nasce quando alla chiusura della pagina devi effettuare una chiamata sul server, in quel caso lì la chiamata non parte.
Potresti creare una tabella con 2 campi: id e timestamp
Nel campo id ci metti l'id degli utenti che effettuano il login, nel campo timestamp ci va il timestamp dell'ultima operazione effettuata da ogni utente.
In pratica ogni volta che l'utente fa qualcosa, anche la semplice apertura di una pagina del tuo sito, devi aggiornare il suo timestamp in questa tabella (o aggiungere una nuova entry se non esiste).
Oltre a questo, la funzione che aggiornerà la tabella deve cancellare le entry con timestamp più vecchio di... decidi tu quanto tempo.
Così se ad esempio decidi che un utente p da ritenersi offline se non fa niente da 5 minuti, tu cancelli le entry con timestamp più vecchi di 5 minuti.
Per indicare chi è online e chi è offline leggi questa tabella.