Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

[ABD] GeoMod

Здесь авторы постили бета-версии своих модификаций для phpBB 2.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

[ABD] GeoMod

Сообщение Coagulant »

Описание мода: Показывает флаг страны пользователя во viewtopic.php, основываясь на его ip. Страна определяется по бд ip2country, поставляемой вместе с модом.
Версия мода: 0.2.1
Cложность установки: Низкая
Время, необходимое для установки: ~ 7 минут
Демо: Посмотреть как это выглядит можно здесь
Скриншот: Различные флаги

Скачать: geomod_021.zip (555 кб) (мод+база ip+флаги)

Устарело:

Уважаемым гуру, просьба подсказать, как прооптимизировать запрос и базу, ибо работает медленно. Любые комментарии/пожелания приветствуются :)

Структура базы:

Код: Выделить всё

CREATE TABLE `phpbb_ip2country` (
  `ip_from` varchar(8) NOT NULL default '',
  `ip_to` varchar(8) NOT NULL default '',
  `country_short` char(2) NOT NULL default '',
  `country` varchar(50) NOT NULL default ''
) TYPE=MyISAM;

INSERT INTO `phpbb_ip2country` VALUES ('0206be38', '0206be3f', 'GB', 'UNITED KINGDOM');
Запрос (модифицирован стандартный из viewonline.php):

Код: Выделить всё

$sql = "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_page, s.session_ip, i.country
	FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s LEFT JOIN ".IP2COUNTRY_TABLE." i
	ON (s.session_ip>=i.ip_from AND s.session_ip<=i.ip_to)
	WHERE u.user_id = s.session_user_id
		AND s.session_time >= ".( time() - 300 ) . "
	ORDER BY u.username ASC, s.session_ip ASC";
Последний раз редактировалось Coagulant 10.04.2006 21:04, всего редактировалось 6 раз.
Аватара пользователя
Vladson
Former team member
Сообщения: 816
Стаж: 19 лет 11 месяцев
Откуда: Estonia, Tallinn

Сообщение Vladson »

Оригинал

Код: Выделить всё

$sql = "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_page, s.session_ip
	FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
	WHERE u.user_id = s.session_user_id
		AND s.session_time >= ".( time() - 300 ) . "
	ORDER BY u.username ASC, s.session_ip ASC";
модифицированый

Код: Выделить всё

$sql = "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_page, s.session_ip, i.country
	FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s, ".IP2COUNTRY_TABLE." i
	WHERE u.user_id = s.session_user_id
		AND s.session_time >= ".( time() - 300 ) . "
		AND s.session_ip >= i.ip_from
		AND s.session_ip <= i.ip_to
	ORDER BY u.username ASC, s.session_ip ASC";
Не проверял, но должно быть так
Серый цвет - светлый (светлее чёрного), но он и тёмный (темнее белого), он же промежуточный (между чёрным и белым). Теорию относительности никто не отменял. Истина в целом - понятие виртуально-ситуативное.
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Vladson
А как быть, если ip не определится по базе? С таким запросом пользователь просто пропадет из списка. Хотя такой случай (не определится страна по базе) я думаю, маловероятен. Однако, опять же, для локальных форумов не будет работать.
Аватара пользователя
Егор Наклоняев
phpBB 2.0.4
Сообщения: 404
Стаж: 19 лет 6 месяцев
Откуда: оттуда

Сообщение Егор Наклоняев »

Гм. А почему не использовать бинарную версию файла, которая свободна распространяется, плюс имеются все библиотеки?

Добавлено спустя 4 минуты 35 секунд:

Кстати, примерно месяца три назад я обсуждал с Xpert стоит ли делать этот MOD или нет и решил его не делать.

А так, флажки у меня показываются на сайте на главной странице, так что темой владею ;)
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Егор Наклоняев писал(а):Гм. А почему не использовать бинарную версию файла, которая свободна распространяется, плюс имеются все библиотеки?
А смысл? Разве будет быстрее? (простите моё невежество)
Аватара пользователя
Vladson
Former team member
Сообщения: 816
Стаж: 19 лет 11 месяцев
Откуда: Estonia, Tallinn

Сообщение Vladson »

А как быть, если ip не определится по базе? С таким запросом пользователь просто пропадет из списка.
Естественно, но это самый простой способ повысить быстродействие (правда будет настолько малый прирост что я вообще сомневаюсь будет ли он вовсе)
Серый цвет - светлый (светлее чёрного), но он и тёмный (темнее белого), он же промежуточный (между чёрным и белым). Теорию относительности никто не отменял. Истина в целом - понятие виртуально-ситуативное.
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Vladson
Для почти пустой таблицы посетителей ваш вариант у меня дает выйгрыш в 1.1 секунды (оно и понятно, LEFT JOIN с выражением отбора - не лучший вариант).Выходит 1.2 и 0.09 соответственно.

Пробовал индексировать таблицу phpbb_ip2country различными способами, но эффекта не дает, видимо надо править запрос как-то.
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Предложенный вариант запроса без LEFT JOIN для 100 пользователей онлайн :wink: дает 1.9599 сек. Оригинальный запрос - 0.0564 сек. Надо бы и его прооптимизировать как-то...

Проблему мода для локалки можно решить добавлением соответствующих диапазонов в таблицу. Получаем страну LAN :P

Код: Выделить всё

INSERT INTO `phpbb_ip2country` VALUES ('0a000000', '0affffff', 'LN', 'LAN');
#10.0.0.0 - 10.255.255.255
INSERT INTO `phpbb_ip2country` VALUES ('7f000000', '7fffffff', 'LN', 'LAN');
#127.0.0.0 - 127.255.255.255
INSERT INTO `phpbb_ip2country` VALUES ('ac100000', 'ac1fffff', 'LN', 'LAN');
#172.16.0.0 - 172.31.255.255
INSERT INTO `phpbb_ip2country` VALUES ('c0a80000', 'c0a8ffff', 'LN', 'LAN');
#192.168.0.0 - 192.168.255.25
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Был найден более быстрый запрос (несколько десятых секунды выйгрыша):

Код: Выделить всё

$sql = "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_page, s.session_ip, i.country 
   FROM ".SESSIONS_TABLE." s STRAIGHT_JOIN ".IP2COUNTRY_TABLE." i STRAIGHT_JOIN ".USERS_TABLE." u
   WHERE u.user_id = s.session_user_id 
      AND s.session_time >= ".( time() - 300 ) . " 
      AND s.session_ip
      BETWEEN i.ip_from
      AND i.ip_to
   ORDER BY u.username ASC, s.session_ip ASC";
Ясно, что подобные конструкции в принципе не смогут обладать должным быстродействием (сотые доли секунды).

Как вариант, можно определять страну для каждого пользователя при создании сессии и хранить её в соответствующей таблице, просто добавив еще одно поле. Что думаете по этому поводу? Не будет ли еще медленнее в итоге?

Предполагается добавить приблизительно вот такой sql запрос при создании сессии:

Код: Выделить всё

SELECT country
FROM phpbb_ip2country
WHERE ip_from <= 'dee10000'
ORDER BY ip_from
LIMIT 1
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Вышла версия 0.2.0 :) Ссылка в первом сообщении темы.

Код: Выделить всё

##   2005-03-12 - Version 0.2.0
##              - IP-to-Country Database updated (01.03.2005)
##              - Russian country names
##              - Country flags in viewonline.php
##              - SQL-query improved
Аватара пользователя
Carbofos
phpBB 1.4.4
Сообщения: 158
Стаж: 19 лет 1 месяц

Сообщение Carbofos »

Посмотрал Гео - понравилось, классная идея :!:
Посмотрел базу данных - понравилось меньше. Там все страны прямо текстом выписаны. Может, лучше заменить их на коды? Я так думаю, одного байта на все страны хватить должно :roll:
Тогда во-первых размер уменьшится, во-вторых, может и еще быстрее будет :D
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Посмотрел базу данных - понравилось меньше. Там все страны прямо текстом выписаны. Может, лучше заменить их на коды? Я так думаю, одного байта на все страны хватить должно
Вы не правы. Придется еще одну таблицу соответствий id страны и названия делать, а это лишний join. Место сэкономим, а в скорости потеряем.
Аватара пользователя
Carbofos
phpBB 1.4.4
Сообщения: 158
Стаж: 19 лет 1 месяц

Сообщение Carbofos »

Ну, я не настаиваю, я не спец :D
Кстати, где можно почитать о быстродействии различных команд в SQL?

Или (совсем улет) - закинуть страны в lang-файлы. :shock:
Тогда вообще не важно будет, на каком форуме (имею ввиду язык) МОД ставить :D
В смысле, тут еще надо подумать, где скорости больше потеряется, в join-е или в Апаче при загрузке и парсинге отдельного файла (все, уже вижу :lol: )
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Идея с lang-файлами мне нравится, я думаю, это оптимальный вариант.
Попробую реализовать, думаю не будет сильно медленнее.
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 3 месяца
Откуда: Москва

Сообщение Coagulant »

Код: Выделить всё

##   2005-03-19 - Version 0.2.1
##              - geomod_db_inst.php included for easy database install (mysql only)
##              - Country names moved to lang_main.php to manage mod translations
##              - Russian translation included
В следующей версии планируется добавить страну и флаг в профиль пользователя (автодетект с возможностью вручную поменять).

Вернуться в «Бета-версии модов для phpBB 2.0.x»