Список пользователей online

-=[KILLER]=-

Новичок
Список пользователей online

Как сделать список пользователей online используя MySQL?
При входе пользователя на сайт в базу заноситься, что пользователь online. При каждом обращении пользователя к скрипту база обновляется. Вопрос: как пользователя выкинуть из базы по истечении лимита времени? Наверняка в MySQL есть штатные средства... Что то вроде таймера.
 

[sid]

Новичок
Штатных средств нет. Надо периодически удалять всех старых пользователей. То есть например если rand(0,100) == 0 (вероятность удачного истечения 1/100) удалять всех пользователей у которых время последнего входа на сайт более, скажем, 5 минут назад! Ну и соостветствующий запрос на выборку!
 

Фанат

oncle terrible
Команда форума
MD
он предлагает стирать не при каждом запросе, а примерно при одном из ста.

Хотя по мне это нафиг не нужно. вполне можно тереть при каждом. тогда и подсчёт можно будет делать без условий
 

MD

Guest
Фанат, та я понял .. просто нафиг оно не нужно тут.
стирать при каждом конечно.
 

-=[KILLER]=-

Новичок
А если вообще не заносить. чтобы потом не стирать. Просто при каждом запросе подсчитывать список:
PHP:
$sql= 'SELECT COUNT(*) AS users_online FROM users WHERE MINUTE(NOW()-last_login_date) < 10';
Только у меня глючит эта система, иногда нормально срабатывает, а иногда нет. Но это возможно зависит от настроек моего MySQL.
Есть ли разница между методами SELECT и UPDATE (какой использует меньше ресурсов бд)?
 

Фанат

oncle terrible
Команда форума
непонятно.
как это - не заносить? а что тогда подсчитывать?
ты имеешь ввиду, наверное, таблицу не users_online, a users?
можно так, да.

непонятно, зачем ты спрашиваешь, что тратит больше ресурсов - ведь и селект и апдейт всё равно делать придётся в любом случае.
что тратит больше ресурсов, попробуй догадаться сам, в виде домашнего задания.

ненормально срабатывает потому, что ты неправильно понимаешь функцию minute.
впрочем, я тоже могу понимать неправильно - в доку не смотрел
 

chira

Новичок
Только у меня глючит эта система, иногда нормально срабатывает, а иногда нет. Но это возможно зависит от настроек моего MySQL.
ты пытаешься в десятичной системе исчисления получить правильный результат для не десятичных чисел (представение времени NOW(), last_login_date ) ...
нужно привести сравниваемые числа к секундам или дням и потом определять прошло 10 минут или нет.
или
last_login_date > DATE_SUB(NOW(),interval 10 MIN)
 

-=[KILLER]=-

Новичок
chira
У тебя ошибка синтаксиса в запросе.

>ты пытаешься в десятичной системе исчисления получить правильный результат

MINUTE(time)
Возвращает количество минут для аргумента time в диапазоне от 0 до 59:
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5

поле last_login_date типа datetime
 

chira

Новичок
-=[KILLER]=-
MINUTE(time)
Возвращает количество минут для аргумента time в диапазоне от 0 до 59:
mysql> SELECT MINUTE('98-02-03 10:05:03');
но ты же не так пытаешься делать, ты пытаешся применить функцию к разнице NOW()-last_login_date
сделай простой селект
SELECT NOW()-last_login_date AS users_online FROM users
и посмотри на результат, в чём он будет в секундах, минутах, часах или тип получится DATETIME?
тип аргумента у функции MINUTE должен быть date(time)
 
Сверху