Как отслеживать активность пользователя в системе?

Ищу решение для того, чтобы решить вопрос записи активности пользователя в системе.

Наш стек:
Vue, Symfony, MySQL

Нужно на определённых страницах записывать факт пребывания пользователя.
Например, когда пришёл когда ушёл.
Сразу оговорюсь, метрика Yandex, Google здесь не котирует.

Всё хорошо до того момента, когда всё идёт не по плану, юзер пришёл на страницу и резко закрыл вкладку, как быть в этой ситуации?

Структура таблицы:

CREATE TABLE `stats_activities` (
	`id` BIGINT(19) NOT NULL AUTO_INCREMENT,
	`organization_id` INT(10) NULL DEFAULT NULL,
	`group_id` INT(10) NULL DEFAULT NULL,
	`project_id` BIGINT(19) NULL DEFAULT NULL,
	`type` TINYINT(1) NOT NULL COMMENT '(DC2Type:stats_activity_type)',
	`start_action_at` DATETIME NULL DEFAULT NULL,
	`end_action_at` DATETIME NULL DEFAULT NULL,
	`user_id` INT(10) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE,
	INDEX `IDX_1343364932C8A3DE` (`organization_id`) USING BTREE,
	INDEX `IDX_13433649FE54D947` (`group_id`) USING BTREE,
	INDEX `IDX_13433649166D1F9C` (`project_id`) USING BTREE,
	INDEX `IDX_13433649A76ED395` (`user_id`) USING BTREE,
	CONSTRAINT `FK_13433649166D1F9C` FOREIGN KEY (`project_id`) REFERENCES `rmok_dev`.`projects` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
	CONSTRAINT `FK_1343364932C8A3DE` FOREIGN KEY (`organization_id`) REFERENCES `rmok_dev`.`organizations` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
	CONSTRAINT `FK_13433649A76ED395` FOREIGN KEY (`user_id`) REFERENCES `rmok_dev`.`users` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
	CONSTRAINT `FK_13433649FE54D947` FOREIGN KEY (`group_id`) REFERENCES `rmok_dev`.`users_group` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=11
;
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
IgorPI
@IgorPI Автор вопроса
Решили использовать сокеты.

Факт открытия сокета создаёт в базе данных запись и сохраняет id записи в памяти.
Факт отключения от сокета обновляет существующую запись в базе данных с второй отметкой времени.

Например, на определённых страницах, где мне необходимо замерять время пребывания, я либо открываю, либо закрываю открытый сокет.

Плюсы
----------------------------------------------------------------------------
Высокая точность измерения
Нет хлама в базе данных в виде дискретных записей.
99 % Гарантия записи end_action_at в базу данных.

Минусы
----------------------------------------------------------------------------
Нужно поднимать отдельно ноду.
Аппендикс в виде маленького сервиса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Если юзер закрыл вкладку, или перешел на неотслеживаемую страницу - значит у него перестал исполняться JavaScript код, который например каждые 5 секунд делает проверочный AJAX-запрос типа PING-PONG (с токеном страницы, конечно).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы