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

    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();
    	}
    
    ?>

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

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

    Успехов ) С наступающим!
    Ответ написан
    8 комментариев