Как обновлять данные каждую секунду в базе данных пока пользователь находится на странице?

Такая проблема: нужно прибавлять к столбцу в базе данных +1 пользователю, который прямо сейчас находится на странице. После выхода чтобы не прибавлялось +1. Может, кто-то знает, как сделать таким образом? Спасибо.
  • Вопрос задан
  • 380 просмотров
Решения вопроса 2
pulman
@pulman
Да, дёргать БД каждую секунду дело не самое лучшее ) можно сделать немного изящнее через JS, если надо просто посчитать сколько пользователь находился на странице секунд. Хотя не со всеми браузерами может прокатить.

В общем отлавливаем событие onbeforeunload, которое срабатывает при переходе пользователя на другую страницу или закрывает окно браузера и отправляем запрос с помощью XHR с GET данными, например с идентификатором пользователя, а уже на стороне сервера обрабатываешь запрос и дописываешь в БД нужные данные.

Пример для JS / PHP, где пыха будет писать данные в файл byefile.txt .

JS:
let now = new Date(); // Фиксируем дату на странице, когда пользователь её загрузил 

window.onbeforeunload = function(e){
 let user = "id00001"; //тут идентификатор пользователя
 let time = now.getTime(); // Переводим время в микросекунды
 let data = user+"&time="+time; // Формируем GET данные для URL
 let URL = "/user_leave?bye="+data; //URL адрес с GET данными
 let xhr = new XMLHttpRequest();  xhr.open('GET', URL, true);  xhr.send(); //Отправляем
};


PHP:
<?
       if(isset($_GET['bye'])){ //Если получен GET запрос 'bye'
		$time_on_page = floor((round(microtime(true) * 1000) - $_GET['time'])/1000); // Переводим время в секунды (время может незначительно отличаться, т.к. JS работает на стороне клиента, PHP на стороне сервера, по этому данные могут разнится.

		$handle = fopen("byefile.txt", "a+"); // Открыли файл для записи
		fwrite($handle, date("H:i d.m.Y")." — \n Пользователь ".$_GET['bye']." провёл на странице ".$_SERVER['HTTP_REFERER']." : ".$time_on_page." сек. \n");  //Сформировали данные для записи
		fclose($handle); //Файл закрыли
    die();
	}

?>

Специально расписал всё отдельно, для понимания. Так то конечно код можно изрядно сократить.
Под БД переделать труда не составит, например по количеству секунд создать нужно кол-во строк и закатать в БД.

А вообще не плохо бы более полно описать задачу, например для каких целей нужно обновлять/добавлять каждую секунду записи в БД, тогда может и решение будет вовсе иным.

Успехов ) С наступающим!
Ответ написан
@yativ_sobb
Обновлять каждую секунду бд плохая идея, лучше хранить секунды в переменной, а когда пользователь выходит, делается запрос в бд.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Забыть про эту нелепую фантазию и заняться чем нибудь полезным.
Ответ написан
Комментировать
BasiC2k
@BasiC2k
.NET developer (open to job offers)
В теле страницы нужно сделать скрипт с таймером, который будет отправлять на сервер запросы пока страница открыта. Сервер по запросу добавляет единицу в БД.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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