Консультация № 111637
29.11.2007, 21:32
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты!
У меня такой вопрос: должен быть сайт с авторизацией на основе форм + БД. Как определить кто в данный момент находится на сайте - нужен список он-лайн.
С тем кто входит - понятно. Сложности начинаются с тем, кто когда выходит с сайта (т.к. конце-концов можно закрыть браузер, перейти на другую страницу...).
Идея следующая: отслеживать время последнего обращения пользователей, ставить таймер на странице с определнным интервалом, и если нет обращения в течение, скажем, двух интервалов - считать ушедшим.
Это реализуемо? Если да то каким образом?
Либо возможно предложить свои варианты.
Желательно ответы с примерами, хорошо бы на .Нет, великолепно, если к тому же на Си#

Обсуждение

давно
Бакалавр
7287
292
30.11.2007, 04:14
общий
замысел про таймер мне кажется не верным.если есть БД, тогда создайте еще одну таблицу и когда польователь обновляет страницу - занесите (обновите) строку в которой указывается его имя и текущая дата (пускай она будет длинным числом, так проще)А так же при заходе пользователя будет идти не только обновление его записи, но и удаление устаревших, по простому условию.запросы писать? я их плохо знаю...а подсмотрел вариант на каком то форуме (когда у него база отвалилась)
Неизвестный
30.11.2007, 21:27
общий
Это тоже не очень хорошо, обновлять информацию только при входе - не верно изначально, человек ушел, скажем полчаса как, даже сессия его умерла, а он висит как он-лайн, почему хотел делать таймер, а не запрос по каждому обращению с клиента - обращения с клиента достаточно частые, кроме того их может быть много, соответсвенно, данные дергать из базы так часто - казалось не очень хорошей идеей
давно
Бакалавр
7287
292
01.12.2007, 07:32
общий
а как вы проверите сессию не зайдя на сайт?не зайдя - не увидите, следовательно получение списка онлайн сцепить с очисткой, как и полагается.
Неизвестный
01.12.2007, 11:01
общий
если Вы понимаете под "при заходе пользователя" в т.ч. и повторное обращение, то в целом можно согласиться, только сессия при этом не стартует.Я обьясню, почему я хотел использовать таймер, есть сайт, на некоторых страницах есть список (именно список, а не просто число) посетителей он-лайн, соответственно прошедших авторизацию, на некоторых - этого списка нет. Значит, время между обращениями с клиента может быть разное. Пусть список с клиента обновляется через 30 сек. (таймер на странице), ну и допустим, посетителей около 100, это значит, что только на чтение из базы данных запросы будут идти каждые 0,3 сек. в среднем + на запись + запросы с других страниц этого же сайта. А СУБД файл-серверная (Firebird). Хорошо? По-моему, не очень. А так мысль была просто обновлять этот список раз в 30 сек. и хранить в переменной на сервере.
давно
Бакалавр
7287
292
01.12.2007, 11:18
общий
сессию и для гостей держать не плохо, да и обновление каждые 0,3 выдумка.это три обращения в секунду, в минуту 180, в час еще больше, мне кажется у БОРа меньше посещаемость.а фаерберд базой сайта? мм, мускуль имхо, хотя автор хозяин и я не смею навязывать свое мнение.а если хотите таймер, крон вам в руки.
Неизвестный
01.12.2007, 22:27
общий
это ответ
Здравствуйте, turis!

I)
Я бы хотел обратить внимание вот на какое решение, оно используется во многих форумных движках. Там есть таблица кэширования, в которую заносятся все ip, имена и время обращения. Запросы к БД делается сразу парой: удаление и добавление.
1. DELETE FROM tbl WHERE tbl.time < time()-10минут.
2. INSERT ... страница, ip, юзер, время...

на основе этой таблицы строется 2ое решение:
1. SELECT ..DISTINCT.. WHERE 1 есть последние пользователи. Так делается например на IPB. При этом 10мин задается в АдминПанеле. Кроме того можно использовать WHERE user=юзер, что бы уменьшить время выборки.
Я понимаю что это кажется безумием! мне тоже так казалось и когда я увидел это в крутом движке я долго был в шоке. Но потом дошло объяснение очень простое: дело всё в размерах таблицы. Дело в том, что на уроках по БД говорят надо экономить время, но время выполнения напрямую зависит от размеров таблицы. Поэтому делать лишний select для талицы в 5кб и для таблицы в 1мб вещи разные, при том очень сильно. Такой мелкий запрос почти не грузит систему, т.к. нужно мало памяти и времени CPU. Поэтому можно сделать 5-7 простых запросов, чем 1 гиганский. Кроме того хорошие СУБД могут оптимизировать этот процесс, уменьшив количество прогонов таблицы (индексы тоже добавят скорости). Кроме того сама таблица будет небольшой по размерам т.к. старые записи будут чиститься. Так же можно уменьшить время на select дописав LIMIT1, что заставит не перебирать всю таблицу, а ограничится первым вхождением (так же нельзя использовать операторы требующие полной выборки, например агрегатне запросы).

2. на базе этого реализуется антиDDoS. Что бы не убить БД делают проверку на количество запросов с определенного ip, если это число больше лимита. Или предидущее обращение было менее 0,5сек назад, то выдаем ошибку или надпись типа закрыто.

================================================
II) доп. запросы создадут избыточную нагрузку на сервер. Допусим пользователь ищет информацию на вашем сайте. Сам допустим ему надо совершить 5 переходов что бы найти нужное. По вашему методу к 5 запросам добавятся ещё таймерные. Что хоть как больше чем есть. Соответственно ваш трафик будет больше.
Форма ответа