2015-06-15 4 views
0

Я не в полной мере понять функции времени PHP, но я под впечатлением моя функция должна работать: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

вы действуете в основном грузопассажирские культовое программирование. 'date()' принимает временную метку и форматирует ее для строки. 'strtotime()' принимает строку и превращает ее в atimestamp. поэтому 'strtotime (date ('...'))' в основном просто массово неэффективное 'time()'. –

+1

Подсказка. Посмотрите, что такое '$ online'. – Anonymous

ответ

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).
  • , что последний интервал, $ offline, даже не нужен, вы его все равно не используете.

Код будет выглядеть примерно так:

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'; 
    } 
} 
Смежные вопросы