Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
В случае, когда пользователь сам нажимает кнопку Выйти, легко отследить и принять, что теперь он оффлайн, а при следующем посещении сайта ему нужно будет залогиниться.
А вот если пользователь закрыл все вкладки с сайтом, то тут тоже нужно считать, что он оффлайн. А когда он снова открывает складку с сайтом, то ему не надо заново логиниться. Подскажите, как отслеживать такую ситуацию и как сделать, чтобы пользователю не нужно было снова логиниться в этом случае?
Используется laravel 5.7
Не в сети
Проще всего считать пользователя оффлайн если он дольше чем N минут не производил никаких запросов (не открывал страниц). Достаточно иметь где-то поле с меткой времени последнего действия.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Проще, но, увы, неправильно. Пользователь может что-то читать или смотреть на странице, и ещё, пока он на какой-либо странице сидит, другие пользователи могут отправлять ему сообщения и видеть, что он онлайн.
Не в сети
Использовать вебсокеты для отслеживания
Не в сети
taraks, можно придумать разные особые случаи, но в общем если пользователь НЕ закрыл вкладку но НЕ делает ничего со страницей (потому что ушел гулять, например), то вряд ли нужно считать его "онлайн". Да он может пассивно смотреть что-то на странице, надо только решить как долго он может это делать прежде чем признать его уснувшим или умершим.
ИМХО, незачем усложнять стек чтобы удостовериться что пользователь ничерта не делает. Проще — лучше.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Использовать вебсокеты для отслеживания
Вообще не обязательно для этого использовать 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
Не в сети
интересно, спасибо!
Не в сети
Страницы 1