我在每个页面顶部使用一个简单的脚本来更新数据库中的LastActive列:
$username = $_SESSION['username'];
$userID = $_SESSION['user_id'];
if(isset($username, $userID)) {
if ($insert_stmt = $mysqli->prepare("UPDATE Users SET lastActive = DATE_ADD(Now(), interval 6 hour) WHERE username = ?")) {
$insert_stmt->bind_param('s', $username);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
$insert_stmt->close();
header('Location: ../headers/error.php?err=Failed Upload');
}
}
$insert_stmt->close();
}
我一直希望牢记性能和安全性。这会导致000万连接中的未来表现不佳吗?
如何使用cookie(我不知道如何)与这样的简单脚本不同?
由于
编辑:
$username = $_SESSION['username'];
$userID = $_SESSION['user_id'];
$loginTime = $_SESSION['timestamp'];
date_default_timezone_set("Europe/London");
$now = new DateTime();
$diff=$now->diff($loginTime);
$minutes = $diff->format(%i);
if(isset($username, $userID) && $minutes> 30) {
$_SESSION['timestamp'] = $now;
$online = true;
}
答案 0 :(得分:1)
一些建议:
您可以通过AJAX执行此操作,以便在用户页面加载后异步更新LastVisited。这样,对用户的页面加载时间不会产生任何影响。
如果由于任何原因,您的SQL查询失败,您应该以静默方式失败。由于记录上次访问对业务不重要,因此不应将用户重定向到错误页面。也许只是记录一个错误,然后设置一个警告,这样如果有多个失败,你会收到警报并可以看一下。
答案 1 :(得分:0)
您使用Cookie制作的所有内容都将是您的用户提供的数据,然后您无法信任它。
另一方面,如果你使用cookies,它们将在每个请求标题中传播。
你应该在服务器端这样做,是的,数据库不具备性能。
您可以尝试使用Redis这样的信息来保存此信息,这是一种内存数据结构存储,用作数据库,缓存和消息代理。
答案 2 :(得分:0)
我以为我会以任何其他寻找用户在线类型方法的方式发布我的方式。当然,这可能会做得更好,但适用于我的情况。
我正在使用数据库条目和会话来测试用户是否在线。
在用户登录时,我使用Now()
时间戳更新users表中的列,并将其添加到其会话数据中。
在每个页面的顶部,我运行一个脚本来检查用户是否已登录并从会话数据中获取时间戳。如果此数据为45分钟,脚本将更新表格,将我的users表格的lastActive
列设置为Now();
<?php
include_once 'functions.php';
if(isset($_SESSION['username'], $_SESSION['user_id'], $_SESSION['lastActive'])) {
date_default_timezone_set("Europe/London");
$now = new DateTime();
$lastActive = $_SESSION['lastActive'];
$diff=$now->diff($lastActive);
$hours = $diff->format('%h');
$mins = $diff->format('%i');
$day = $diff->format('%d');
$month = $diff->format('%m');
$year = $diff->format('%y');
if($mins > 45 || $hours >= 1 || $day >= 1 || $month >= 1 || $year >= 1) {
$_SESSION['lastActive'] = $now;
set_last_active($mysqli, $_SESSION['username']);
}
}
set_latst_action只是:
function set_last_active($mysqli, $username) {
if ($stmt = $mysqli->prepare("UPDATE Users SET lastActive = Now() WHERE username = ?")) {
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->close();
}
}
然后当我想查看用户是否在个人资料页面上在线时,我致电isOnline();
function isOnline($mysqli, $username) {
if ($stmt = $mysqli->prepare("SELECT lastActive FROM Users WHERE username = ? LIMIT 1")) {
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 1) {
$stmt->bind_result($return);
$stmt->fetch();
$lastActive = $return;
} else {
// user does not exist
$lastActive = "";
return $lastActive;
$stmt->close();
}
} else {
// SELECT failed
$lastActive = "";
return $lastActive;
$stmt->close();
}
if (!empty($lastActive)) {
date_default_timezone_set("Europe/London");
$dateNow = new DateTime;
$lastActiveDate = new DateTime($lastActive);
$diff=$dateNow->diff($lastActiveDate);
$hours = $diff->format('%h');
$mins = $diff->format('%i');
$day = $diff->format('%d');
$month = $diff->format('%m');
$year = $diff->format('%y');
if ($mins > 45 || $hours >= 1 || $days >= 1 || $month >= 1 || $year >= 1) {
$return = "Offline";
return $return;
}
else {
$return = "Online";
return $return;
}
}
else {
$return = "Offline";
return $return;
}
}