Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±

    Очередность выполнения функций. Проверка на возврат

    В общем, дело такое. Писал я себе писал мод и на локалке горя не знал, но как только стал тестировать на хосте замтил одну странную проблему. Есть у меня код загрузки данных игрока из БД вот такой:
    PHP код:
    function UploadPlayerAccount(playerid)
    {
    new 
    cmdstr[128];
        
    format(cmdstr,sizeof(cmdstr),"SELECT * FROM `admins` WHERE `pID` = '%d'",PlayerInfo[playerid][pID]);
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadAdmins""i"playerid);
        
        
        
    format(cmdstr,sizeof(cmdstr),"SELECT * FROM `player_weapons` WHERE `pwID` = '%d'",PlayerInfo[playerid][pID]);
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerWeapons""i"playerid);
        
        
        
    format(cmdstr,sizeof(cmdstr),"SELECT * FROM `player_weapon_skills` WHERE `pID` = '%d'",PlayerInfo[playerid][pID]);
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerWeaponSkills""i"playerid);

        
        
    format(cmdstr,sizeof(cmdstr),"SELECT * FROM `player_specials` WHERE `pID` = '%d'",PlayerInfo[playerid][pID]);
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerSpecials""i"playerid);
        
        
        
    format(cmdstr,sizeof(cmdstr),"SELECT * FROM `player_licenses` WHERE `pID` = '%d'",PlayerInfo[playerid][pID]);
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerLicenses""i"playerid);

            
    SpawnPlayer(playerid// -Вот вызов спавна игрока

    В конце паблика, после всех загрузок я делаю спавн игрока. На самом деле я думал что каждый следующий вызов паблика для обработки mysql запроса будет выполнен как только предыдущий вернет значение, но я ошибался. Они все вызываются по очереди но не ждут завершения работы друг друга и получается что игрок спавнится а только потом в его переменные доганяются значения из БД. На локалке все работало супер - потому что задержки обработки запроса практически небыло, а на хостинге она появилась и в связи с этим игрок спавнится быстрее чем возвращаются данные из БД. Хотелось бы узнать как можно данную фигню обыграть, так как еще не сталкивался с таким :)

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    mysql_tquery -> mysql_query
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    qwezert (04.01.2017)
  4. #3
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    mysql_tquery -> mysql_query
    Все дошло) щас переделаю)
    Все запахало, спасибо. Я уже и забыл про то что эту функцию не вырезали :D
    Последний раз редактировалось qwezert; 04.01.2017 в 01:10.

  5. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    Все дошло) щас переделаю)
    Все запахало, спасибо. Я уже и забыл про то что эту функцию не вырезали :D
    Только не забывай, что твой сервер теперь просто зависает в ожидании выполнения каждого запроса.

  6. 3 пользователя(ей) сказали cпасибо:
    $continue$ (04.01.2017) Daniel_Cortez (04.01.2017) qwezert (04.01.2017)
  7. #5
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Только не забывай, что твой сервер теперь просто зависает в ожидании выполнения каждого запроса.
    Да я это понимаю, поэтому сейчас придумываю пути выхода из этой ситуации. Думал по началу экран загрузки делать, но потом понял что сервер будет подвисать для всех игроков, а не только для тех кто авторизуется.
    Сейчас у меня есть вариант совместить экран загрузки аккаунта с проверкой на загруженные данные на таймере что бы избежать спавна раньше загруженных данных. Подвисание в пол секунды не особо заметно, но при большом онлайне - станет проблемой. Еще как вариант про коннекте игрока загружать сразу все данные. Хотя это и не правильно, зато потом никаких проблем.

    Думаю в данной ситуации самым правильным решением будет все занести под один запрос не разбивая его на части как сделал я.
    PHP код:
    SELECT FROM `players
    LEFT JOIN player_weapon_skills pws ON p
    .pID pws.pID
    LEFT JOIN player_licenses pl ON p
    .pID pl.pID
    LEFT JOIN player_specials ps ON p
    .pID ps.pID
    WHERE p
    .pID 99
    И уже из кеша доставать всю нужную информацию. Да конечно придется дописывать всегда в запрос все новые таблицы связанные с игроком и свзяывать их, но к сожалению павн не позволяет сделать по другому. Лучше я пожертвую читабельностью и удобностью чем производительностью.
    Последний раз редактировалось DeimoS; 04.01.2017 в 13:11.

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Можешь заставить подвисать одного игрока - грузи запросы последовательно и в паблике последнего вызывай спавн.

    То бишь

    PHP код:
    function UploadPlayerAccount(playerid

        
    //...
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadAdmins""i"playerid); 
    }

    function 
    LoadAdmins(playerid

        
    //...
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerWeapons""i"playerid); 
    }

    function 
    LoadPlayerWeapons(playerid

        
    //...
        
    mysql_tquery(mysql_connect_IDcmdstr"LoadPlayerWeaponSkills""i"playerid); 
    }

    //...


    function LoadPlayerLicenses(playerid

        
    //...
        
    SpawnPlayer(playerid);

    Хотя странно, что такие простые запросы обрабатываются с задержкой на хостинге
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    qwezert (04.01.2017)
  10. #7
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Да я думал так делать, но для меня уже проще сделать один комбинированный запрос, так как смысла в разделении на отдельные паблики практически никакого нет. Но если вдруг понадобится буду делать каскадом. Спасибо всем)

  11. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    Да я думал так делать, но для меня уже проще сделать один комбинированный запрос, так как смысла в разделении на отдельные паблики практически никакого нет. Но если вдруг понадобится буду делать каскадом. Спасибо всем)
    Смысл лишь в том, что спавнить нужно после обработки запроса => внутри паблика, который вызывается для обработки. Тогда страдать будет лишь один игрок, в основном.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •