Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.05.2021 03:31:23

Как отслеживать, пользователь онлайн или оффлайн?

В случае, когда пользователь сам нажимает кнопку Выйти, легко отследить и принять, что теперь он оффлайн, а при следующем посещении сайта ему нужно будет залогиниться.
А вот если пользователь закрыл все вкладки с сайтом, то тут тоже нужно считать, что он оффлайн. А когда он снова открывает складку с сайтом, то ему не надо заново логиниться. Подскажите, как отслеживать такую ситуацию и как сделать, чтобы пользователю не нужно было снова логиниться в этом случае?

Используется laravel 5.7

Не в сети

#2 21.05.2021 17:13:18

Re: Как отслеживать, пользователь онлайн или оффлайн?

Проще всего считать пользователя оффлайн если он дольше чем N минут не производил никаких запросов (не открывал страниц). Достаточно иметь где-то поле с меткой времени последнего действия.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 21.05.2021 17:17:34

Re: Как отслеживать, пользователь онлайн или оффлайн?

Проще, но, увы, неправильно. Пользователь может что-то читать или смотреть на странице, и ещё, пока он на какой-либо странице сидит, другие пользователи могут отправлять ему сообщения и видеть, что он онлайн.

Не в сети

#4 22.05.2021 10:59:07

Re: Как отслеживать, пользователь онлайн или оффлайн?

Использовать вебсокеты для отслеживания

Не в сети

#5 22.05.2021 14:39:52

Re: Как отслеживать, пользователь онлайн или оффлайн?

taraks, можно придумать разные особые случаи, но в общем если пользователь НЕ закрыл вкладку но НЕ делает ничего со страницей (потому что ушел гулять, например), то вряд ли нужно считать его "онлайн". Да он может пассивно смотреть что-то на странице, надо только решить как долго он может это делать прежде чем признать его уснувшим или умершим.

ИМХО, незачем усложнять стек чтобы удостовериться что пользователь ничерта не делает. Проще — лучше.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 31.05.2021 00:07:48

Re: Как отслеживать, пользователь онлайн или оффлайн?

Использовать вебсокеты для отслеживания

Вообще не обязательно для этого использовать WebSockets. Сегодня нынче их везде суют, не зная про старый-добрый EventSource - "односторонний" аналог, который не требует ни Node.js (на котором так любят писать сервера WS), ни особой настройки сервера, ни особого протокола, а его API просто и понятно:

var es = new EventSource('foo.php')
es.onmessage = function (e) {
  alert(e.data)
}

На стороне сервера:

<?php
header("Content-Type: text/event-stream");
header("X-Accel-Buffering: no");  // если у вас nginx

while (true) {
  echo "data: hello!\r\n\r\n";
  ob_flush();
  flush();
  sleep(5);
}

И все.

А по сабжу, на клиенте достаточно всего-навсего в любом месте открыть поток и забыть про него:

new EventSource('online.php')

На сервере - как я написал выше, кидать в поток пустые сообщения каждые N секунд, чтобы избежать таймаута. И пока скрипт крутится - считать клиента в онлайне. Через register_shutdown_function() на отключение можно как-то отреагировать, сбросить там флаг в БД и пр. Даже если у клиента целый день открыта страница в фоне и он с ней ничего не делает - поток будет работать.

Особое достоинство в том, что EventSource сам переподключается, если соединение рвется (ушел в ждущий режим, в метро и т.п. WebSockets нервно курит в сторонке при реализации подобных задач.

У EventSource еще много интересного - советую почитать MDN: https://developer.mozilla.org/en-US/doc … ventSource

Не в сети

#7 31.05.2021 08:00:12

Re: Как отслеживать, пользователь онлайн или оффлайн?

интересно, спасибо!

Не в сети

Подвал раздела