flo.mAster 7 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 (изменено) Данный модуль предназначен для вывода информации о посетителях сайта. Количество запросов к MySQL: от 1 и более Внимание, появилась панель управления модуля. Все настройки и т.д. производятся именно там! Возможности: - Вывод места находжения пользователя - Вывод количества гостей - Вывод количества всех посетителей - Вывод количества роботов - Вывод количества пользователей - Вывод списка роботов - Вывод списка пользователей - Вывод аватара пользователя - Вывод IP адреса прользователя - Вывод прокси пользователя - Вывод ОС пользователя - Вывод браузера пользователя - Вывод последнего посещения пользователя - Вывод группы пользователя - Вывод флага страны - Вывод страны пользователя - Вывод города пользователя - Администрирование модулем из панели управления Module Online v4.0: [*] Список операционных систем [*] Список роботов [*] Изменены настройки [+] Администрирование модулем через панель управления Module Online v3.3: [*] Алгоритм удаления старых записей [*] Список браузеров [*] Список роботов [*] Проблема связанная с раздвоением когда юзер заходит на сайт как гость потом авторизуется Module Online v3.0: [*] Вывод IP для определённых груп [*] Вывод Proxy для определённых груп [*] Вывод браузера [*] Создание уникального ключа для того, что бы показывало всех пользователей, даже если у них одинаковый IP Module Online v2.0: [+] Вывод страны пользователя [+] Вывод города пользователя [*] Вывод последнего посещения [*] Вывод флага страны пользователя [*] Вывод прокси [*] Вывод места нахождения пользователя [*] Очистка таблицы от старых данных Module Online v1.5: [+] Вывод флага страны [*] Вывод места находжения пользователя [+] Вывод последнего посещения пользователя [+] Вывод группы пользователя [*] Вывод списка онлайн [*] Количество минут за которые пользователь считается онлайн [*] Оптимизирован код Module Online v1.0: [+] Вывод места находжения пользователя [+] Вывод количества гостей [+] Вывод количества всех посетителей [+] Вывод количества роботов [+] Вывод количества пользователей [+] Вывод списка роботов [+] Вывод списка пользователей [+] Вывод аватара пользователя [+] Вывод IP адреса прользователя [+] Вывод прокси пользователя [+] Вывод ОС пользователя [+] Вывод браузера пользователя Ссылка на скачку: http://radio.aplus.by/FreSh/Module_Online_v4.0.rar Тема для обсуждения: http://forum.dle-news.ru/index.php?showtopic=45721 Автор: FreSh (я) ICQ: 466131809 E-mail: ult.artem@gmail.com Изменено 1 июля 2009 пользователем IT-Security 4 Цитата Ссылка на сообщение Поделиться на других сайтах
Sarvan 35 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 На конец то хоть кто-то взялся Насчёт названия модуля, может приписку какую свою сделаешь, а то их уже столько, что при поиске именно твой врятли найдёшь. )) Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 Автор На конец то хоть кто-то взялся Насчёт названия модуля, может приписку какую свою сделаешь, а то их уже столько, что при поиске именно твой врятли найдёшь. )) )) Есть может предложения насчёт приписки? Цитата Ссылка на сообщение Поделиться на других сайтах
veb74 10 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 Можно ли добавить последних посетителей, штуки три-четыре в список ? Цитата Ссылка на сообщение Поделиться на других сайтах
lexx21 0 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 и чем от других такихже отличается? Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 28 апреля 2009 Рассказать Опубликовано: 28 апреля 2009 Автор Можно ли добавить последних посетителей, штуки три-четыре в список ? Непонял вопроса... И не понял зачем это показывать? Если пользователен неактивен 5 минут - все эти 5 минут он будет отображен, потом просто удалится. и чем от других такихже отличается? Во первых вес файла: другой - 35кб, мой - 6 кб. Во вторых запросами: если читать отзывы о других модулях - очень большая нагрузка на сервер, чуть ли не 20-40 запросов.... В моей же версии не больше четырёх. В третьих: любой другой захламлён ненужным кодом: любой другой: 804 строчки, моя версия: 164. Хотя по функционалу одно и тоже. Цитата Ссылка на сообщение Поделиться на других сайтах
maks1192 96 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Тока надо ещё чуть подредактировать под красивость Как сторонний модуль на моём сайте: + можно для визуальной красивости добавить иконки к юзерам, роботу и т.д. Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 В моей же версии не больше четырёх. я как-то обхожусь 1-2 запросами при сохранении текущего функционала. Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор В моей же версии не больше четырёх. я как-то обхожусь 1-2 запросами при сохранении текущего функционала. Скидывай код, посмотрим на твои 1-2 запроса. Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 flo.mAster, не в обиду - а самому подумать? я не за неделю пришёл к данному техническому решению и испробовал кучу вариантов, прежде чем прийти к этому. Впрочем, так и быть, но только в качестве доказательства, т.к. трепаться каждый горазд. В будущем, пожалуйста, доверяйте на слово. $found = false; if (isset($_COOKIE['twso_online'])){ $twsf_online = explode('-', $_COOKIE['twso_online']); if (date("Y-m-d", $twsf_online[0]) == date("Y-m-d", TIME) && $twsf_online[1] == $member_id['user_id']) { $found = true; } } if ($found && $twsf_online[0] > (TIME - 10)) return; if ($found){ $db->query("UPDATE " . USERPREFIX . "_twso_online SET time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0 WHERE onl_u_id = {$member_id['user_id']}"); } else { $db->query("INSERT INTO " . USERPREFIX . "_twso_online (onl_u_id, name, time, hidden, user_group, unlogged) values ({$member_id['user_id']}, '{$member_id['name']}', '{$thistime}', {$member_id['unable_online']}, {$member_id['user_group']}, 0) ON DUPLICATE KEY UPDATE time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0"); } вывод списка ещё проще $db->query("SELECT * FROM " . USERPREFIX . "_twso_online ORDER BY time DESC"); while ($row = $db->get_row()){ $row['time'] = strtotime($row['time']); Кэширование использовать не рекомендую = быстрее загубит винт, нежели придаст скорость Код совершенно легко дорабатывается и до учёта гостей. Тип таблицы - memory. Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор flo.mAster, не в обиду - а самому подумать? я не за неделю пришёл к данному техническому решению и испробовал кучу вариантов, прежде чем прийти к этому. Впрочем, так и быть, но только в качестве доказательства, т.к. трепаться каждый горазд. В будущем, пожалуйста, доверяйте на слово. $found = false; if (isset($_COOKIE['twso_online'])){ $twsf_online = explode('-', $_COOKIE['twso_online']); if (date("Y-m-d", $twsf_online[0]) == date("Y-m-d", TIME) && $twsf_online[1] == $member_id['user_id']) { $found = true; } } if ($found && $twsf_online[0] > (TIME - 10)) return; if ($found){ $db->query("UPDATE " . USERPREFIX . "_twso_online SET time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0 WHERE onl_u_id = {$member_id['user_id']}"); } else { $db->query("INSERT INTO " . USERPREFIX . "_twso_online (onl_u_id, name, time, hidden, user_group, unlogged) values ({$member_id['user_id']}, '{$member_id['name']}', '{$thistime}', {$member_id['unable_online']}, {$member_id['user_group']}, 0) ON DUPLICATE KEY UPDATE time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0"); } вывод списка ещё проще $db->query("SELECT * FROM " . USERPREFIX . "_twso_online ORDER BY time DESC"); while ($row = $db->get_row()){ $row['time'] = strtotime($row['time']); Кэширование использовать не рекомендую = быстрее загубит винт, нежели придаст скорость Код совершенно легко дорабатывается и до учёта гостей. Тип таблицы - memory. Понял суть мыслей Решено куками ... я не парился пока, что по этому поводу ...) Ты добавь сюда гостей, и учится на +1 запрос. У меня 4 ибо проверку на существование строчки в базе я проверяю запросом. Если чесна - куками как то тупо это делать ..) Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 если гость можно использовать IP а не логин. А логин в куках вообще нет смысла хранить, можно просто проверять заданы куки или нет. Поэтому при грамотном подходе и для гостей и для пользователей можно использовать один и тот же запрос. Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления. Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор если гость можно использовать IP а не логин. А логин в куках вообще нет смысла хранить, можно просто проверять заданы куки или нет. Поэтому при грамотном подходе и для гостей и для пользователей можно использовать один и тот же запрос. Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления. Я использую для гостей IP. Для юзерей - логин. Может подскажите как граммостно сделать? Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 flo.mAster, А у вас что неграмотно? Я просто не смотрел ваш модуль, поэтому не знаю грамотно или нет. Грамотно, это 1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн. 2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть. 3. Не хранить статистику более интервала online 4. Не делать коротким интервал online, не ниже 15 минут. Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн. они тогда "мелькать" будут. Тут чуток другая роль куков. 2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть. всё равно это в полтора раза дольше простого update. 3 и 4 уже по желанию. В зависимости от концепции модуля. Что делать ключем? Мне кажется самый лучщий вариант (для вашего модуля) - это "сумма" ip и ид пользоавателя. Т.е. создание уникального ключа исходя из этих данных. Я использую для гостей IP. Для юзерей - логин. ключ должен быть 1, иначе не прокатит. Использовать ip не очень хорошо, он не отражает разных пользователей. Я пробовал, там потом вообще глюки начинаются, когда на 1 ип, являющийся ключом, переписываются данные разных пользователей. Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления. в зависимости от концепции. У меня это не только online, но и кто был. Вообще ИМХО - порочная вещь - хранить сколько заходило гостей - увеличивать размеры таблицы в 20 раз и более... Тут уже надо быть аккуратным с типом таблицы heap - может переполнится. Особенно, если в ней будет много информации. Я правда не доходил до этого потолка, но мало ли... Хотя хранение "гостей" многим нравится. Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор flo.mAster, А у вас что неграмотно? Я просто не смотрел ваш модуль, поэтому не знаю грамотно или нет. Грамотно, это 1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн. 2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть. 3. Не хранить статистику более интервала online 4. Не делать коротким интервал online, не ниже 15 минут. 1. Очень хороший вариант ... но в модуле есть функция где находится юзер и сами понимаете нужно обновлять каждый раз .... хотя думаю убрать эту функцию дабы уменьшить количество запросов к базе данных 2. Ух, хорошая весч! Сразу -1 запрос! Огромное спасибо. 3. Реализовано 4. Реализовано (дефолт 5 минут) Кстате, забыл написать, что в начале файла online.php есть 2 настройки. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 они тогда "мелькать" будут. Тут чуток другая роль куков. не понял что вы имеете ввиду, под словом "мелькать". По поводу роли, я не знаю какую роль вы для них задумывали, я лишь смотрю на код который вы написали. Разберем его по кусочкам: $found = false; if (isset($_COOKIE['twso_online'])){ $twsf_online = explode('-', $_COOKIE['twso_online']); if (date("Y-m-d", $twsf_online[0]) == date("Y-m-d", TIME) && $twsf_online[1] == $member_id['user_id']) { $found = true; } } if ($found && $twsf_online[0] > (TIME - 10)) return; if ($found){ $db->query("UPDATE " . USERPREFIX . "_twso_online SET time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0 WHERE onl_u_id = {$member_id['user_id']}"); } else { $db->query("INSERT INTO " . USERPREFIX . "_twso_online (onl_u_id, name, time, hidden, user_group, unlogged) values ({$member_id['user_id']}, '{$member_id['name']}', '{$thistime}', {$member_id['unable_online']}, {$member_id['user_group']}, 0) ON DUPLICATE KEY UPDATE time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0"); }[/code] зачем хранить в куках дату и логин и запускать сложные проверки с запуском функций даты, когда кукам можно задать срок жизни на 10 минут. И они автоматически удалятся по истечении срока жизни, это стандартная возможность браузеров и PHP. В итоге ваш код можно сократить до [code] if (isset($_COOKIE['twso_online'])){ $db->query("INSERT INTO " . USERPREFIX . "_twso_online (onl_u_id, name, time, hidden, user_group, unlogged) values ({$member_id['user_id']}, '{$member_id['name']}', '{$thistime}', {$member_id['unable_online']}, {$member_id['user_group']}, 0) ON DUPLICATE KEY UPDATE time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0"); } else { return; } проверка if ($found && $twsf_online[0] > (TIME - 10)) return; бессмысленна если для куков установлен срок жизни на 10 минут. Проверка $twsf_online[1] == $member_id['user_id'] бессмысленна, потому что в других переменных куков уже есть данные об авторизации. Куки уже персонализированы сами по себе. всё равно это в полтора раза дольше простого update. Не имеет значения, т.к. таблица содержит слишком мало значений. Основное время у запросов уходит на отправку прием пакетов. В этом легко убеится запустив профилирование запроса. Поэтому один запрос для маленькой таблицы гораздо эффективней чем два. Цитата Ссылка на сообщение Поделиться на других сайтах
freeswap 2 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Господа, может быть чем плодить десятками одинаковые модули, придадим одному из них официальный статус? Вещь ведь нужная и полезная. 2 Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор Господа, может быть чем плодить десятками одинаковые модули, придадим одному из них официальный статус? Вещь ведь нужная и полезная. Я за. Только как именно придать официальный статус? Кстате, какой мне префикс сделать своему модулю, что бы его отличали юзеры? P.S. На подходе v1.5 версия. Максимально уменьшена нагрузка на сервер. 2 запроса к MySQL (исключение: 3 запроса к базе данных, когда пользователь зашёл в первый раз или прошло время тайм-аута). Появилась настройка: "Выводить где находится посетитель?" (+1 запрос к базе данных ПОСТОЯННО). По умолчанию - отключено. Возможно пришью GeoIP. Для вывода флага страны возле IP адреса посетителя. Тока надо ещё чуть подредактировать под красивость Как сторонний модуль на моём сайте: Это реализовано! Смотрим readme.chm + можно для визуальной красивости добавить иконки к юзерам, роботу и т.д. Подумаю =) Цитата Ссылка на сообщение Поделиться на других сайтах
freeswap 2 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Я за. Только как именно придать официальный статус? Это только в celsoft'y А на счет функционала, например в block_online 2.3, который кстати работает во всех версиях включая и 8.0, выводится браузер, операционка, группа пользователя, аватар, местоположение на сайте, страну, город, ипишник и когда был последний раз. Мне кажется это все должно быть, но как опция, чтоб можно было или включить или выключить. Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор Я за. Только как именно придать официальный статус? Это только в celsoft'y А на счет функционала, например в block_online 2.3, который кстати работает во всех версиях включая и 8.0, выводится браузер, операционка, группа пользователя, аватар, местоположение на сайте, страну, город, ипишник и когда был последний раз. Мне кажется это все должно быть, но как опция, чтоб можно было или включить или выключить. Лень скачать модуль и посмотреть что он может!? Всё, кроме группы и когда был в последний раз - РЕАЛИЗОВАНО. Когда был в последний раз = сделаю в версии 1.5, ровно также как и группу. Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 (изменено) зачем хранить в куках дату Я не очень доверяю системе их автоматической очистки броузером, плюс у меня же не стоит - убить через 10 минут, у меня стоит date("Y-m-d", $twsf_online[0]) == date("Y-m-d", TIME). Т.е. чтобы кука была не действительна в 12 часов ночи. логин Дело в том, что можно разлогинется и зайти под другим пользователем. А кука всё ещё будет существовать. У меня в таблице ключом является user_id. И если кука будет существовать от другого пользователя, то запрос $db->query("UPDATE " . USERPREFIX . "_twso_online SET time = '{$thistime}', hidden = {$member_id['unable_online']}, user_group={$member_id['user_group']}, unlogged=0 WHERE onl_u_id = {$member_id['user_id']}"); сработает в пустую и мы потеряем обоих пользователей. проверка if ($found && $twsf_online[0] > (TIME - 10)) return; это 10 секунд. Защита на случай, если пользователь за раз открывает несколько страниц сайта. Позволяет снизить лишние "холостые" запросы. Основное время у запросов уходит на отправку прием пакетов. В этом легко убеится запустив профилирование запроса. Поэтому один запрос для маленькой таблицы гораздо эффективней чем два. Это я знаю. Поэтому и использован DUPLICATE KEY. Не имеет значения, т.к. таблица содержит слишком мало значений возможно тут вы и правы. Про DUPLICATE KEY я узнал значительно позже, чем родялся этот алгоритм. Поэтому тут есть издержки. не понял что вы имеете ввиду, под словом "мелькать". Это когда пользователь один раз отметиться в модуле и в течении 15 минут не будут идти запросы. Только когда он выпадет из online и умрёт его кука, только тогда он снова будет обновлён в блоке он-лайн. Это я про это 1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн. Изменено 29 апреля 2009 пользователем Al-x Цитата Ссылка на сообщение Поделиться на других сайтах
flo.mAster 7 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Автор Дело в том, что можно разлогинется и зайти под другим пользователем. А кука всё ещё будет существовать. У меня в таблице ключом является user_id. И если кука будет существовать от другого пользователя, то запрос Можно проверить: есть юзер логинится или разлогинивается - сбросить куки. Правда получается у меня пока только при логине: if( isset( $_POST['login'] ) and $_POST['login'] == "submit" ) { set_cookie( "module_online", "", 0 ); } Цитата Ссылка на сообщение Поделиться на других сайтах
freeswap 2 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Лень скачать модуль и посмотреть что он может!? Всё, кроме группы и когда был в последний раз - РЕАЛИЗОВАНО. Прежде скачал и поставил его. Кроме группы вроде ж еще нету страны и города? Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 29 апреля 2009 Рассказать Опубликовано: 29 апреля 2009 Дело в том, что можно разлогинется и зайти под другим пользователем. А кука всё ещё будет существовать. У меня в таблице ключом является user_id. И если кука будет существовать от другого пользователя, то запрос зразлогинивание можно узнать элентарно if( $_REQUEST['action'] == "logout" ) и удалить свою кукуЭто когда пользователь один раз отметиться в модуле и в течении 15 минут не будут идти запросы. Только когда он выпадет из online и умрёт его кука, только тогда он снова будет обновлён в блоке он-лайн. если логин пропадет на минуту если он активно находится на сайте, после 15 минут, то это мелочи по сравнению с экономленной нагрузкой. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.