Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


 
IP:176.32.36.96:7777 Ha6op adm,liderov + bonuse.

**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Показано с 1 по 8 из 8
  1. #1
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    273
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,132
    Репутация:
    1256 ±
    mysql_tquery -> mysql_query
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

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

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

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

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    273
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,132
    Репутация:
    1256 ±
    Можешь заставить подвисать одного игрока - грузи запросы последовательно и в паблике последнего вызывай спавн.

    То бишь

    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);

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

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

    Steve Pavlina

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

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

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

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

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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