Полагаю, вы понимаете, что этот код
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
//...
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
запускается при каждом запросе и только при поступлении запроса
Представьте, что я захожу на ваш сайт, а затем go за покупками, сохраняя браузер открытым. Как ты думаешь, что произойдет? НИЧЕГО - потому что вам не будет отправлен новый запрос (при условии, что вы не внедрили механизм periodi c ajax опроса / Websocket)
Так что сервер не будет беспокоиться обо мне, пока я не приду Вернитесь из магазина и обновите страницу sh, только тогда сервер поймет: «Хммм ... LAST_ACTIVITY этого парня старше часа, позвольте мне обновить таблицу trace_users
и установить для него значение false
"
Что касается предложенного вами решения, оно выглядит хорошо и позволяет избежать сложностей websockets / periodi c ajax запросов
Просто нужно внести некоторые незначительные исправления, следуйте здесь для ознакомления с c demo
<script>
var lastActivity = <?php echo ($_SESSION['LAST_ACTIVITY']); ?>; //the timestamp of latest page refresh or navigation
//This will remain constant as long as page stays put
var now = <?php echo time() ?>; //This takes inital value (technically same as LAST_ACTIVITY) from server
// but later on it will be incremented by javascript to act as counter
var logoutAfter = 5; //I set 5 sec for demo purposes
var timer = setInterval(function() {
now++;
let delta = now - lastActivity;
if ( delta > logoutAfter) {
alert('you are logged out');
clearInterval(timer);
//DO AJAX REQUEST TO close.php
}
}, 1000);
</script>
Здесь lastActivity
будет содержать метку времени, когда страница была отправлена сервером в браузер, она никогда не будет изменяться скриптами в браузере, now
- ваш счетчик, который вы будете использовать для отслеживания того, сколько время, прошедшее с момента загрузки страницы в браузер, вы будете увеличивать ее каждую секунду и проверять, не прошло ли заданное количество времени
Если true, выполните * 10 46 * запрос (или просто перенаправление на выход из системы. php), где вы бы уничтожили сеанс и обновили таблицу trace_users
, чтобы пометить пользователя как закрытого
ОБНОВЛЕНИЕ
Так ajax будет похоже на
$.ajax({
url: "/close.php",
type: 'POST', // GET also fine
data: { },
success: function(data) {
window.location.href= '/mmo.php';
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus);
}
});
и
close. php
<?php
session_start();
$logoutAfter = 5; //5 sec timeout for testing purposes
// I'm not sure whether the below if condition check is required here or not
// because we have already checked (whether to timeout or not ) in our javascript
// and we call close.php only when it's affirmative
// I encourage you to test and find out :)
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $logoutAfter)) {
session_destroy(); // destroy session data in storage
!isset($_SESSION['pageadmin']);
/* Update Table (START) */
$open="false";
$stmt= $connect->prepare("UPDATE trace_users SET open=? WHERE user_name=?");
$stmt->bind_param('ss', $open, $_SESSION['user_name']);
$stmt->execute();
/* Update Table (END) */
//header('location: /mmo.php'); //<-- no need of it when url hit by ajax
exit();
}
else //<-- note the else
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp