HLStatsX:CE и MySQL 5.7

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #1
Всем добрый вечер. Попробовал на днях "подружить" HLStatsX:CE и MySQL 5.7. Из-за некоторых особенностей новой версии сервера БД, они стабильно и адекватно вместе не работают, а на Ubuntu 16.04, по дефолту идёт именно версия 5.7. Решения из Интернета полноценно не помогли, пришлось снова допиливать под себя. Делюсь инструкцией, вдруг у кого-то такой же "маразм" пробудится (вроде запуска HLStatsX:CE на последней версии MySQL), как у меня.

1). Выключаем демона, если он запущен.
2). Открываем файл /HLstats.plib в папке с демоном, ищем:
PHP:
$db_conn->do("SET NAMES 'utf8'");
Заменяем на:
PHP:
$db_conn->do("SET NAMES 'utf8mb4'");
Сохраняем изменения, закрываем.

3). Создаём файл на веб-хостинге с именем, скажем, /hlstats_mysql57_convert.php, помещаем его в одной папке с веб-частью HLStatsX:CE. Копируем код из под спойлера, и вставляем в него:
PHP:
<?php
Header("Content-Type: text/plain");

define('IN_HLSTATS', true);
require_once('config.php');

define('DB_PORT', 3306); // порт от сервера БД. Измените, если он не стандартный.

$hDB = null;
$errors = false;

$pdo_options =  [
    PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC
];

try {
        $hDB = new PDO(sprintf("mysql:host=%s;dbname=%s;charset=utf8;port=%d", DB_ADDR, DB_NAME, DB_PORT), DB_USER, DB_PASS, $pdo_options);
} catch (PDOException $e) {
        echo($e->getMessage());
        exit(-1);
}

$hTables = $hDB->query("SHOW TABLES;");
while ($row = $hTables->fetch(PDO::FETCH_BOTH)) {
    try {
        $table = $row[0];
        $data = $hDB->query("DESCRIBE `" . $table . "`;");
        while ($structrow = $data->fetch(PDO::FETCH_BOTH)) {
            if ($structrow['Type'] == "datetime")
                $hDB->exec("ALTER TABLE `" . $table . "` CHANGE `" . $structrow['Field'] . "` `" . $structrow['Field'] . "` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;");
            else if ($structrow['Type'] == "date")
                $hDB->exec("ALTER TABLE `" . $table . "` CHANGE `" . $structrow['Field'] . "` `" . $structrow['Field'] . "` DATE NOT NULL;");
        }

        $hDB->exec("ALTER TABLE `" . $table . "` ROW_FORMAT=DYNAMIC;");
        $hDB->exec("ALTER TABLE `" . $table . "` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;");
    } catch (PDOException $e) {
        echo("Произошла ошибка при обработке таблицы ");
        echo($table);
        echo("\n");
        echo($e->getMessage());
        echo("\n\n");
        $errors = true;
    }
}

if (!$errors) {
    echo("Всё хорошо.");
} else {
    echo("Возникли некоторые проблемы. Обратитесь в тему, скопировав лог ошибок.");
}

4). Запускаем скрипт через браузер. Если вылезет "Всё хорошо.", значит, теперь можно запускать демона.

Теперь необходимо починить веб-часть. Если она выдаёт ошибку при открытии профилей игроков, и показывает не весь профиль, то Вам эти шаги так же надо сделать.

1). Подключаемся к веб-серверу через SSH или открываем ISP Manager.
2). Заходим в конфигурацию MySQL сервера.
Обратите внимание: заходить надо из под пользователя root!
1). Открываем раздел "Настройки", ищем "Серверы баз данных".
2). Выбираем свой сервер, нажимаем "Настройки".
3). Ищем параметр "sql-mode", нажимаем "Изменить".
4). Добавляем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!).
5). Нажимаем "Ok".
pDRKI2p.png

Wuqg0tz.png

0QwWoKO.png
1). Переходим в папку конфигурации MySQL и открываем файл любым удобным текстовым редактором.
C-подобный:
root@kruzefag:~# cd /etc/mysql/mysql.conf.d/
root@kruzefag:/etc/mysql/mysql.conf.d# nano mysqld.cnf

2). Ищем параметр sql-mode, дописываем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!). Если не нашли, копируем и вставляем следующую строку в самый конец файла:
C-подобный:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3). Сохраняем файл и закрываем редактор. В nano для сохранения - это комбинация клавиш CTRL + O, после чего Enter. Закрытие редактора - CTRL + X.

4). Перезапускаем MySQL-сервер.
C-подобный:
root@kruzefag:/etc/mysql/mysql.conf.d# service mysqld restart

После всех вышепроделанных операций, демон и веб-часть HLStatsX:CE "подружились" с новой версией MySQL. По крайней мере, ошибками не сыплет, вроде как.
Тема будет обновляться по мере возникновения новых проблем у этой связки.
 
Последнее редактирование:

Lima

Участник
Сообщения
159
Реакции
57
Спасибо, выручил.
P.S Надеюсь когда-нибудь появится рефорк HLStatsX:CE от тебя:ab:
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #3
когда-нибудь появится рефорк HLStatsX:CE от тебя
Было бы желание - был бы и рефорк. Пока что его нет. Да и неохота как-то копаться в коде, который, вроде бы, старее того, что используется в SourceBans.
Оффтоп
 

Dreizehnt

Доминик
Сообщения
1,160
Реакции
798
Было бы желание - был бы и рефорк. Пока что его нет. Да и неохота как-то копаться в коде, который, вроде бы, старее того, что используется в SourceBans.
Оффтоп
Маркони, да Поповы кругом, так выходит что придумывают вместе с тобой :D... А вообще если начать, может задонатим тебе и люди которые хотят получить систему будут на виду, тебе не на энтузиазме работать и мы хоть как-то отплатим? :D
 

Red4911

Участник
Сообщения
133
Реакции
34
Я бы тоже задонатил на это дело. Все таки давно пора уже эту стату обновлять.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #6
Если очень интересно, в планах есть переписать HLStatsX:CE. Правда, только для себя.
Был даже куплен вот такой шаблон.

В планах:
  • Переписать полностью веб.
  • Доработать плагины.
  • Доработать демона.
Если будет что-то потестить - возможно, солью) Правда, не в паблик)
 

Red4911

Участник
Сообщения
133
Реакции
34
А зачем его покупать, эти шаблоны и так по инету валяются. А так пиши я потещу, ну и донат само собой с меня.
 

Suchimauz

Участник
Сообщения
52
Реакции
4
Сам шаблон мне понравился, хотел отблагодарить автора за труды. А там как раз скидочка была хорошая...
Тебе не известно? как сделать так, чтобы hlstatsx брал названия кланов не с ника, с аименно с клан-тега в cs:go, потому что сейчас никто не пишет клан в ник а пишут в клан тег
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #10
@bodya020309, хлстатс берет всю инфу из логов. Следовательно, тебе надо как-то заставить его увидеть строчку в логе, что у игрока клан тег ХХХХХ. Ну и придется возможно демона покопать, чтобы он это корректно обрабатывал.
 

Suchimauz

Участник
Сообщения
52
Реакции
4
@bodya020309, хлстатс берет всю инфу из логов. Следовательно, тебе надо как-то заставить его увидеть строчку в логе, что у игрока клан тег ХХХХХ. Ну и придется возможно демона покопать, чтобы он это корректно обрабатывал.
понял, в каких файлах копать не подскажешь?
 

Ixxx

Участник
Сообщения
49
Реакции
9
@Крузяра, привет, вот такое вот вылезло в 3 пункте.

C-подобный:
Произошла ошибка при обработке таблицы hlstats_Events_Connects
SQLSTATE[01000]: Warning: 1265 Data truncated for column 'eventTime_Disconnect' at row 1

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

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #14
В принципе, это всего лишь предупреждение. Ничего страшного не произойдёт.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #16
А сам запрос можете показать? Он там мелким шрифтом пишет.
А так, да, из-за этого.
 

Ixxx

Участник
Сообщения
49
Реакции
9
А сам запрос можете показать?
C-подобный:
Last SQL Query:
                                SELECT
                                    hlstats_Events_Frags.weapon,
                                    hlstats_Weapons.name,
                                    COUNT(hlstats_Events_Frags.weapon) AS kills,
                                    SUM(hlstats_Events_Frags.headshot=1) as headshots
                                FROM
                                    hlstats_Events_Frags
                                LEFT JOIN
                                    hlstats_Weapons
                                ON
                                    hlstats_Weapons.code = hlstats_Events_Frags.weapon
                                WHERE
                                    hlstats_Events_Frags.killerId=1
                                GROUP BY
                                    hlstats_Events_Frags.weapon
                                ORDER BY
                                    kills desc, headshots desc
                                LIMIT
                                    1

C-подобный:
Last SQL Query:
        SELECT
            IFNULL(hlstats_Roles.name, hlstats_Events_ChangeRole.role) AS name,
            IFNULL(hlstats_Roles.code, hlstats_Events_ChangeRole.role) AS code,
            COUNT(hlstats_Events_ChangeRole.id) AS rolecount,
            ROUND(COUNT(hlstats_Events_ChangeRole.id) / IF(0 = 0, 1, 0) * 100, 2) AS percent,
            hlstats_Frags_as_res.killsTotal,
            hlstats_Frags_as_res.deathsTotal,
            ROUND(hlstats_Frags_as_res.killsTotal / IF(hlstats_Frags_as_res.deathsTotal = 0, 1, hlstats_Frags_as_res.deathsTotal), 2) AS kpd
        FROM
            hlstats_Events_ChangeRole
        LEFT JOIN
            hlstats_Roles
        ON
            hlstats_Events_ChangeRole.role = hlstats_Roles.code
        LEFT JOIN
            hlstats_Frags_as_res
        ON
            hlstats_Frags_as_res.role = hlstats_Events_ChangeRole.role
        WHERE
            hlstats_Events_ChangeRole.playerId = 1
            AND
            (
                hidden <> '1'
                OR hidden IS NULL
            )
            AND hlstats_Roles.game = 'css'
        GROUP BY
            hlstats_Events_ChangeRole.role
        ORDER BY
            rolecount desc,
            name desc
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #18
Тут уже в конфиге Мускла дело. Об этом я тоже писал.
 

Alice.bnd

Участник
Сообщения
26
Реакции
4
Всем добрый вечер. Попробовал на днях "подружить" HLStatsX:CE и MySQL 5.7. Из-за некоторых особенностей новой версии сервера БД, они стабильно и адекватно вместе не работают, а на Ubuntu 16.04, по дефолту идёт именно версия 5.7. Решения из Интернета полноценно не помогли, пришлось снова допиливать под себя. Делюсь инструкцией, вдруг у кого-то такой же "маразм" пробудится (вроде запуска HLStatsX:CE на последней версии MySQL), как у меня.
2). Ищем параметр sql-mode, дописываем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!). Если не нашли, копируем и вставляем следующую строку в самый конец файла:
Хочется добавить, что при миграции с 5.5 на 5.7 так-же следует установить optimizer_switch = 'condition_fanout_filter=off' (по умолчанию он включен), в противном случае запросы к страницам логов чата с серверов будут выполняться 25-30 секунд, а не 0,01 мс. Возможно, прирост будет не так заметен на небольших проектах, но у меня скапливается более 800 тысяч строк чата за месяц.
 
Последнее редактирование:

Похожие темы

Сверху Снизу