Сессии вообще про другое.
Общая логика в таких случаях: заводим юзеру в табличке поле с datetime последнего действия на сайте.
(Под действием понимаем в простом варианте - запрос любой страницы)
Соответственно обновляем это поле.
Все юзеры у кого время последнего действия > (now - nn секунд) считаются online.
Для гостей, если нужно по честному считать - скрыто регистрируем каждого, ставим вечную куку с авторизацией и далее как для авторизированых.