PHP检查用户是否在线

时间:2015-06-15 19:43:13

标签: php date datetime timestamp

我不完全理解PHP时间函数,但我的印象是我的函数应该有效:

function user_status($timestamp){
        $online = date('Y-m-d H:i:s', strtotime('-5 minutes', strtotime(date('Y-m-d H:i:s'))));
        $away = date('Y-m-d H:i:s', strtotime('-15 minutes', strtotime(date('Y-m-d H:i:s'))));
        $offline = date('Y-m-d H:i:s', strtotime('-30 minutes', strtotime(date('Y-m-d H:i:s'))));

        if(strtotime($timestamp) >= $online){
            return 'online';
        } else if(strtotime($timestamp) >= $away){
            return 'away';
        } else {
            return 'offline';
        }
    }

当我传递用户上次活动时的时间戳时,它总是返回在线状态。这里的问题是什么?我只是错误地格式化状态变量吗?

1 个答案:

答案 0 :(得分:2)

我必须承认PHP中的日期/时间函数有点麻烦。这就是我在处理日期和时间时始终使用Carbon工具箱的原因。如果你正在使用作曲家,包括它就像在你的控制台中输入composer require nesbot/carbon一样简单。

它不仅非常完整且易于使用,它只是使您的代码更具可读性。使用Carbon的代码看起来像这样:

function user_status($timestamp){
    $lastAction = Carbon::createFromTimeStamp($timestamp);
    $minutesIdle = $lastAction->diffInMinutes(Carbon::now());

    if ($minutesIdle > 30) {
         return 'offline';
    } else if ($minutesIdle > 15) {
         return 'away';
    } else {
         return 'online';
    }
}

我还没有对代码进行过测试,但我相信它应该可以解决问题。

话虽这么说,你的代码也不应该很难开始工作。

  • 删除对日期的解析,并坚持使用时间戳(基本上是自纪元以来的秒数,以防您不知道)。
  • 从你最大的间隔开始,按照你的方式工作,或者你确实总是在网上找到“#”;作为答案(30> 15> 5)。
  • 最后一个时间间隔,$离线,甚至不需要,你无论如何都不能使用它。

代码看起来像这样:

function user_status($timestamp){
    $now = time();
    $online = $now - 5*60;
    $away = $now - 15*60;
    // just for readability, you could also do $online = time() - 300; and so on

    if($timestamp <= $away){
        return 'offline';
    } else if($timestamp <= $online){
        return 'away';
    } else {
        return 'online';
    }
}