Да, дёргать БД каждую секунду дело не самое лучшее ) можно сделать немного изящнее через 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();
}
?>
Специально расписал всё отдельно, для понимания. Так то конечно код можно изрядно сократить.
Под БД переделать труда не составит, например по количеству секунд создать нужно кол-во строк и закатать в БД.
А вообще не плохо бы более полно описать задачу, например для каких целей нужно обновлять/добавлять каждую секунду записи в БД, тогда может и решение будет вовсе иным.
Успехов ) С наступающим!