Вопрос № 111637: Здравствуйте, уважаемые эксперты!
У меня такой вопрос: должен быть сайт с авторизацией на основе форм + БД. Как определить кто в данный момент находится на сайте - нужен список он-лайн.
С тем кто входит - понятно. Сложности начинаются с тем, ...
Вопрос № 111.637
Здравствуйте, уважаемые эксперты!
У меня такой вопрос: должен быть сайт с авторизацией на основе форм + БД. Как определить кто в данный момент находится на сайте - нужен список он-лайн.
С тем кто входит - понятно. Сложности начинаются с тем, кто когда выходит с сайта (т.к. конце-концов можно закрыть браузер, перейти на другую страницу...).
Идея следующая: отслеживать время последнего обращения пользователей, ставить таймер на странице с определнным интервалом, и если нет обращения в течение, скажем, двух интервалов - считать ушедшим.
Это реализуемо? Если да то каким образом?
Либо возможно предложить свои варианты.
Желательно ответы с примерами, хорошо бы на .Нет, великолепно, если к тому же на Си#
Отправлен: 29.11.2007, 21:32
Вопрос задал: turis (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: NiGHT
Здравствуйте, 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 запросам добавятся ещё таймерные. Что хоть как больше чем есть. Соответственно ваш трафик будет больше.
--------- Нам много не надо, лишь власти над миром, и вкусненького что-нибудь (Slayers)
Ответ отправил: NiGHT (статус: Практикант)
Ответ отправлен: 01.12.2007, 22:27