我有一个如下所示的 php 代码,其中当没有事件时, session 超时会在 60 分钟后发生。以下代码位于文件 /mno.php 内。我的登录和注销代码也位于同一个文件/mno.php中。
/mno.php
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
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');
exit();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
代码中的表trace_users跟踪所有登录的用户。在该表中,有两列 user_name 和 open。当任何用户登录/注销时,该值设置为true/false。
我已经包含了 sql 查询,其中我尝试在没有事件时更新表,但不幸的是该特定用户的列值没有设置为 false 当 60 分钟内没有任何事件发生时。
这是我尝试过的:
经过一些研究,我想我必须运行一个计时器(js/ajax)。在下面显示的 JavaScript 中,我计算了上次事件和当前时间之间的差异。 如果超过 60 分钟,则会更新数据库表。这是我尝试过的,但我相信需要做更多工作才能更新数据库中的表。
<script>
let x = setInterval(function() {
let lastActivity = <?php echo ($_SESSION['LAST_ACTIVITY']); ?>
let now = <?php echo time() ?>;
let difference = now - lastActivity;
if (difference > 3600) {
clearInterval(x);
}
}, 1000
);
</script>
问题陈述:
我想知道我应该在上面的 js(或 php)代码中进行哪些更改,以便当 60 分钟没有事件时,它应该将列 open 更新为 false (在表 trace_users 中)该特定用户。
编辑1:
我的登录代码和 session 历史记录代码位于同一个文件/mno.php中。我已将所有内容放在同一个文件 /mno.php 中。
最佳答案
我认为 Vineys 和 jo0gbe4bstjbs 的答案是错误的,因为当用户关闭浏览器直到 5 秒时,它也无法在 60 分钟后更新表格和 session 。 session 在 php.ini 配置文件中设置的时间后立即删除。 您介意每 5 秒请求一次吗?这是解决这个问题的好方法吗?这对于性能来说是最差的。 如果你想专业地解决这个问题,你应该添加“last_request”列并从表中删除“open”列,并且在每次请求之后你应该将last_requests值更新为当前的unix时间戳。在获取用户的地方你应该写:
$time = time() - 3600;
"SELECT * FROM `users` WHERE last_request > $time" //active users
"SELECT * FROM `users` WHERE last_request <= $time" //inactive users
而不是每 5 秒 ajax 请求一次,你应该编写 setTimeout ,延迟时间为 3600 秒,运行 window.location.href= '/mmo.php';代码。 如果您想要获得最佳性能并在 60 分钟注销后获得准确结果,那么这是很好的选择
关于javascript - 在php中更新 session 超时的数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61298432/