HLX Проблема с плагином

Тема в разделе "Программирование / Скриптинг", создана пользователем Danyas, 26 фев 2016.

  1. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    PHP:
    #pragma newdecls required

    Database hDatabase null;

    public 
    Plugin myinfo =
    {
        
    name "HLStatsX: TOP Announcer",
        
    author "Danyas"
    }

    public 
    void OnPluginStart()
    {
        
    SQL_TConnect(GotDatabase"hlstats");
    }

    public 
    GotDatabase(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    hndl == INVALID_HANDLE)   {LogError("Database failure: %s"error); return;}
        
    hDatabase hndl;
    }


    public 
    OnClientPostAdminCheck(client)
    {
        if (
    client == 0) return;
        
    decl String:steamid[32], String:query[500];
        
    GetClientAuthString(clientsteamidsizeof(steamid));
        
    Format(querysizeof(query), "SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'v34' AND hideranking = 0 AND skill > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUniqueIds.playerId WHERE uniqueID = MID('%s', 9) AND hlstats_PlayerUniqueIds.game = 'v34') -1"steamid);
        
    SQL_TQuery(hDatabaseT_CheckTop10queryclient);
    }

    public 
    T_CheckTop10(Handle:ownerHandle:hndl, const String:error[], any:client)
    {
        if (!
    IsClientConnected(client) || IsFakeClient(client))    return;
        if (
    hndl == INVALID_HANDLE)    {LogError("Query failed! %s"error);}
        else if (
    SQL_FetchRow(hndl))  
        {
            new 
    pid SQL_FetchInt(hndl0);
            if(
    pid 0)
            {
                if(
    pid 11)        PrintToChatAll("\x04[HLStatsX:CE]\x03 ТОП-10\x01 Игрок \x03%N\x01 подключен.",client);
                else if(
    pid 6)    PrintToChatAll("\x04[HLStatsX:CE]\x03 ТОП-5\x01 Игрок \x03%N\x01 подключен."client);
                else if(
    pid 4)    PrintToChatAll("\x04[HLStatsX:CE]\x03 ТОП-3\x01 Игрок \x03%N\x01 подключен."client);
                else if(
    pid 2)    PrintToChatAll("\x04[HLStatsX:CE]\x03 ТОП-1\x01 Игрок \x03%N\x01 подключен."client);
            }
        }
    }

    Еррорит так:
    L 02/26/2016 - 09:49:57: [vip/topgiver.smx] Query failed! Lost connection to MySQL server during query
    SM 1.7, плагин написан на 1.6
    Буду раз если кто-то объяснит как базы на 1.7 перенести.

    Плагин работает отлично, но просто в логах мусорит
     
    Последнее редактирование: 26 фев 2016
  2. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Что в логах мусюкля? Причин может быть много.
     
  3. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
  4. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    MYSQL стоит на cPanel`e, я понятия не имею как найти логи
     
  5. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Вот что нашёл
     

    Вложения:

    666FoX666 нравится это.
  6. Tallanvor

    Tallanvor Красноглазый

    Сообщения:
    1.072
    Симпатии:
    299
    @Danyas, Запрос вручную выполнял для теста?
    Посмотри, сколько времени выполняется и проверь лимиты в самом мускуле.
     
  7. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    [​IMG]
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 16996745
    Server version: 5.6.28 MySQL Community Server (GPL)

    Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'v34' AND hideranking = 0 AND skil l > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUni queIds.playerId WHERE uniqueID = MID('%s', 9) AND hlstats_PlayerUniqueIds.game = 'v34') -1;
    +------+
    | rank |
    +------+
    | 0 |
    +------+
    1 row in set (0.01 sec)

    mysql> SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'v34' AND hideranking = 0 AND skil l > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUni queIds.playerId WHERE uniqueID = MID('STEAM_0:0:1842773827', 9) AND hlstats_PlayerUniqueIds.game = 'v34') -1;
    +------+
    | rank |
    +------+
    | 1 |
    +------+
    1 row in set (0.00 sec)

    mysql> SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'v34' AND hideranking = 0 AND skil l > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUni queIds.playerId WHERE uniqueID = MID('STEAM_0:0:903485671', 9) AND hlstats_PlayerUniqueIds.game = 'v34') -1;
    +------+
    | rank |
    +------+
    | 10 |
    +------+
    1 row in set (0.00 sec)


    mysql> SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'v34' AND hideranking = 0 AND skill > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUniplayerId WHERE uniqueID = MID('STEAM_0:0:903485671', 9) AND hlstats_PlayerUniqueIds.game = 'v34') -1;
    ERROR 2006 (HY000): MySQL server has gone away
    No connection. Trying to reconnect...
    Connection id: 16998252
    Current database: f3397_v34_hlstatsx

    +------+
    | rank |
    +------+
    | 10 |
    +------+
    1 row in set (0.11 sec)
     
  8. Tallanvor

    Tallanvor Красноглазый

    Сообщения:
    1.072
    Симпатии:
    299
    @Danyas, ну да, дело явно не в долгом запросе...

    А вот это ужо напрягает.
    С чем связан обрыв то?
     
  9. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Техподдержка так и не нашла проблемы, агент отписывал мол у него уже 20 часов коннект идет, и не прерывается.
    В HLX-e (perl, коннект от perl'a к бд хостинга) аналогичная проблема в логах есть, но на работу она никак не влияет (точно так же как и в плагине выше).
     
  10. Tallanvor

    Tallanvor Красноглазый

    Сообщения:
    1.072
    Симпатии:
    299
    @Danyas, поднять БД локально и плагином поспрашивать её - не вариант?
    Так сразу половина направлений поиска откинется.
     
  11. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Danyas нравится это.
  12. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Сделал, только коннектился через внешний IP. Проблема есть, отписал в тп и приложил видос, пока думают
     
  13. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Перечитал первый пост. Если плагин работает нормально и вам мешают только ошибки, то их можно убрать.
    Нужно это:
    Код:
    if (hndl == INVALID_HANDLE)    {LogError("Query failed! %s", error);}
        else if (SQL_FetchRow(hndl))  
    Заменить на это:
    Код:
    if ((hndl != INVALID_HANDLE) && SQL_FetchRow(hndl))  
     
  14. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Это да, я так и использую в остальных плагинах, но не забывай о том, что при реконнекте к базе мы теряем время порядка 0.1-0.3 секунды, и можем смело его прибавить к времени запроса.
     
  15. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    @Danyas, запрос, который выдал ошибку в сообщении 7 точно правильный? Он отличается от других.
    Вот это:
    Код:
    hlstats_Players.playerId = hlstats_PlayerUniplayerId
    Не должно быть так?
    Код:
    hlstats_Players.playerId = hlstats_PlayerUniqueIds.playerId
     
  16. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    Он правильный, так как выполнился, возможно при копировании из ssh что-то не скопировалось
     
  17. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    С помощью гугла узнал ещё вот что
    1. В databases.cfg timeout должен быть 0 или большим.
    2. В старых версиях SM был такой баг, что терялось соединение и вылезала эта ошибка.
    3. Может быть, если база не на локалхосте.


    Хотя если взять факт, что запрос выполняется, мне думается что виноват мусукль. А в особенности его слишком короткий таймаут.
    Всё же интересны логи, они должны быть где то тут:
    Код:
    MySQL error log    /var/lib/mysql/{SERVER_NAME}.err
    MySQL slow query log (if enabled in my.cnf)    /var/log/slowqueries
     
  18. Tallanvor

    Tallanvor Красноглазый

    Сообщения:
    1.072
    Симпатии:
    299
    Очень сильно подозреваю, что доступа туда нет, ибо хостинг...
     
  19. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    @Tallanvor, я увидел на скрине слово VPS. И доступ к консолю мусукля есть.
     
  20. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.714
    Симпатии:
    451
    PHP:
    f3397@frog [/var/lib/mysql]# ls /var/lib/mysql/
    /bin/lscannot open directory /var/lib/mysql/: Permission denied
    f3397
    @frog [/var/lib/mysql]# cd /var/log/
    f3397@frog [/var/log]# ls
    ./  ../

    PHP:
        "hlstats"
        
    {
            
    "driver"            "mysql"
            "host"                "xxx"
            "database"            "xxx"
            "user"                "xxx"
            "pass"                "xxx"
            
    //"timeout"            "0"
            
    "port"                "3306"
        
    }
    Сейчас попробую убрать // перед timeout