Перейти к публикации

Рекомендованные сообщения

screenshot.jpg

Данный модуль предназначен для вывода информации о посетителях сайта.

Количество запросов к 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

Изменено пользователем IT-Security
Ссылка на сообщение
Поделиться на других сайтах

На конец то хоть кто-то взялся :) Насчёт названия модуля, может приписку какую свою сделаешь, а то их уже столько, что при поиске именно твой врятли найдёшь. ))

Ссылка на сообщение
Поделиться на других сайтах

На конец то хоть кто-то взялся :) Насчёт названия модуля, может приписку какую свою сделаешь, а то их уже столько, что при поиске именно твой врятли найдёшь. ))

)) Есть может предложения насчёт приписки?

Ссылка на сообщение
Поделиться на других сайтах

Можно ли добавить последних посетителей, штуки три-четыре в список ? ;)

Непонял вопроса... И не понял зачем это показывать? Если пользователен неактивен 5 минут - все эти 5 минут он будет отображен, потом просто удалится.

и чем от других такихже отличается?

Во первых вес файла: другой - 35кб, мой - 6 кб.

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

В третьих: любой другой захламлён ненужным кодом: любой другой: 804 строчки, моя версия: 164. Хотя по функционалу одно и тоже.

;)

Ссылка на сообщение
Поделиться на других сайтах

Тока надо ещё чуть подредактировать под красивость :)

Как сторонний модуль на моём сайте:

2bb1eac88557.gif

+ можно для визуальной красивости добавить иконки к юзерам, роботу и т.д.

Ссылка на сообщение
Поделиться на других сайтах

В моей же версии не больше четырёх.

я как-то обхожусь 1-2 запросами при сохранении текущего функционала.

Скидывай код, посмотрим на твои 1-2 запроса.

Ссылка на сообщение
Поделиться на других сайтах

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,

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

Впрочем, так и быть, но только в качестве доказательства, т.к. трепаться каждый горазд. В будущем, пожалуйста, доверяйте на слово.

		$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 ибо проверку на существование строчки в базе я проверяю запросом. Если чесна - куками как то тупо это делать ..)

Ссылка на сообщение
Поделиться на других сайтах

если гость можно использовать IP а не логин. А логин в куках вообще нет смысла хранить, можно просто проверять заданы куки или нет. Поэтому при грамотном подходе и для гостей и для пользователей можно использовать один и тот же запрос.

Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления.

Ссылка на сообщение
Поделиться на других сайтах

если гость можно использовать IP а не логин. А логин в куках вообще нет смысла хранить, можно просто проверять заданы куки или нет. Поэтому при грамотном подходе и для гостей и для пользователей можно использовать один и тот же запрос.

Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления.

Я использую для гостей IP. Для юзерей - логин.

Может подскажите как граммостно сделать?

Ссылка на сообщение
Поделиться на других сайтах

flo.mAster,

А у вас что неграмотно? Я просто не смотрел ваш модуль, поэтому не знаю грамотно или нет.

Грамотно, это

1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн.

2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть.

3. Не хранить статистику более интервала online

4. Не делать коротким интервал online, не ниже 15 минут.

Ссылка на сообщение
Поделиться на других сайтах

1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн.

они тогда "мелькать" будут. Тут чуток другая роль куков.

2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть.

всё равно это в полтора раза дольше простого update.

3 и 4 уже по желанию. В зависимости от концепции модуля.

Что делать ключем?

Мне кажется самый лучщий вариант (для вашего модуля) - это "сумма" ip и ид пользоавателя. Т.е. создание уникального ключа исходя из этих данных.

Я использую для гостей IP. Для юзерей - логин.

ключ должен быть 1, иначе не прокатит.

Использовать ip не очень хорошо, он не отражает разных пользователей. Я пробовал, там потом вообще глюки начинаются, когда на 1 ип, являющийся ключом, переписываются данные разных пользователей.

Опять таки интервал задан на целые сутки. Зачем когда 15 минут достаточно, маленькая таблица = быстрое выполнение запросов на вставку и обновления.

в зависимости от концепции. У меня это не только online, но и кто был.

Вообще ИМХО - порочная вещь - хранить сколько заходило гостей - увеличивать размеры таблицы в 20 раз и более... Тут уже надо быть аккуратным с типом таблицы heap - может переполнится. Особенно, если в ней будет много информации. Я правда не доходил до этого потолка, но мало ли...

Хотя хранение "гостей" многим нравится.

Ссылка на сообщение
Поделиться на других сайтах

flo.mAster,

А у вас что неграмотно? Я просто не смотрел ваш модуль, поэтому не знаю грамотно или нет.

Грамотно, это

1. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн.

2. Не проверять есть значение в БД, а сразу вставлять с проверкой INSERT INTO ..... ON DUPLICATE KEY этот запрос будет вставлять значение если его нет и обновлять если оно есть.

3. Не хранить статистику более интервала online

4. Не делать коротким интервал online, не ниже 15 минут.

1. Очень хороший вариант ... но в модуле есть функция где находится юзер и сами понимаете нужно обновлять каждый раз .... хотя думаю убрать эту функцию дабы уменьшить количество запросов к базе данных :)

2. Ух, хорошая весч! Сразу -1 запрос! Огромное спасибо.

3. Реализовано

4. Реализовано (дефолт 5 минут)

Кстате, забыл написать, что в начале файла online.php есть 2 настройки.

Ссылка на сообщение
Поделиться на других сайтах

они тогда "мелькать" будут. Тут чуток другая роль куков.

не понял что вы имеете ввиду, под словом "мелькать". По поводу роли, я не знаю какую роль вы для них задумывали, я лишь смотрю на код который вы написали. Разберем его по кусочкам:

		$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.

Не имеет значения, т.к. таблица содержит слишком мало значений. Основное время у запросов уходит на отправку прием пакетов. В этом легко убеится запустив профилирование запроса. Поэтому один запрос для маленькой таблицы гораздо эффективней чем два.

Ссылка на сообщение
Поделиться на других сайтах

Господа, может быть чем плодить десятками одинаковые модули, придадим одному из них официальный статус? Вещь ведь нужная и полезная.

Ссылка на сообщение
Поделиться на других сайтах

Господа, может быть чем плодить десятками одинаковые модули, придадим одному из них официальный статус? Вещь ведь нужная и полезная.

Я за. Только как именно придать официальный статус?

Кстате, какой мне префикс сделать своему модулю, что бы его отличали юзеры?

P.S. На подходе v1.5 версия. Максимально уменьшена нагрузка на сервер. 2 запроса к MySQL (исключение: 3 запроса к базе данных, когда пользователь зашёл в первый раз или прошло время тайм-аута). Появилась настройка: "Выводить где находится посетитель?" (+1 запрос к базе данных ПОСТОЯННО). По умолчанию - отключено. Возможно пришью GeoIP. Для вывода флага страны возле IP адреса посетителя.

Тока надо ещё чуть подредактировать под красивость :)

Как сторонний модуль на моём сайте:

2bb1eac88557.gif

Это реализовано!

Смотрим readme.chm

+ можно для визуальной красивости добавить иконки к юзерам, роботу и т.д.

Подумаю =)

Ссылка на сообщение
Поделиться на других сайтах

Я за. Только как именно придать официальный статус?

Это только в celsoft'y :)

А на счет функционала, например в block_online 2.3, который кстати работает во всех версиях включая и 8.0, выводится браузер, операционка, группа пользователя, аватар, местоположение на сайте, страну, город, ипишник и когда был последний раз. Мне кажется это все должно быть, но как опция, чтоб можно было или включить или выключить.

Ссылка на сообщение
Поделиться на других сайтах

Я за. Только как именно придать официальный статус?

Это только в celsoft'y :)

А на счет функционала, например в block_online 2.3, который кстати работает во всех версиях включая и 8.0, выводится браузер, операционка, группа пользователя, аватар, местоположение на сайте, страну, город, ипишник и когда был последний раз. Мне кажется это все должно быть, но как опция, чтоб можно было или включить или выключить.

Лень скачать модуль и посмотреть что он может!? :angry:

Всё, кроме группы и когда был в последний раз - РЕАЛИЗОВАНО.

Когда был в последний раз = сделаю в версии 1.5, ровно также как и группу.

Ссылка на сообщение
Поделиться на других сайтах

зачем хранить в куках дату

Я не очень доверяю системе их автоматической очистки броузером, плюс у меня же не стоит - убить через 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. зафиксировать за пользователем куки и не делать от него ни одного запроса к БД пока не истек интервал которым он считается онлайн.
Изменено пользователем Al-x
Ссылка на сообщение
Поделиться на других сайтах

Дело в том, что можно разлогинется и зайти под другим пользователем. А кука всё ещё будет существовать. У меня в таблице ключом является user_id. И если кука будет существовать от другого пользователя, то запрос

Можно проверить: есть юзер логинится или разлогинивается - сбросить куки.

Правда получается у меня пока только при логине:

if( isset( $_POST['login'] ) and $_POST['login'] == "submit" )

{

	set_cookie( "module_online", "", 0 );

}

Ссылка на сообщение
Поделиться на других сайтах

Лень скачать модуль и посмотреть что он может!?

Всё, кроме группы и когда был в последний раз - РЕАЛИЗОВАНО.

Прежде скачал и поставил его. Кроме группы вроде ж еще нету страны и города?

Ссылка на сообщение
Поделиться на других сайтах

Дело в том, что можно разлогинется и зайти под другим пользователем. А кука всё ещё будет существовать. У меня в таблице ключом является user_id. И если кука будет существовать от другого пользователя, то запрос

зразлогинивание можно узнать элентарно

if( $_REQUEST['action'] == "logout" )

и удалить свою куку

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

если логин пропадет на минуту если он активно находится на сайте, после 15 минут, то это мелочи по сравнению с экономленной нагрузкой.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...