最后在线php

时间:2016-02-14 19:09:26

标签: php

我在每个页面顶部使用一个简单的脚本来更新数据库中的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;
}

3 个答案:

答案 0 :(得分:1)

一些建议:

  1. 您可以通过AJAX执行此操作,以便在用户页面加载后异步更新LastVisited。这样,对用户的页面加载时间不会产生任何影响。

  2. 如果由于任何原因,您的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;
    }
}