Jump to content

Не закрываются xml файлы


Recommended Posts

Добрый вечер, у меня на сервере постепенно пополняется число открытых xml файлов.

qDa0UBStdvs.jpg

По такому принципу выполняется открытие файлов во всём моде:

  
function banks ( res ) 
    if res == getThisResource() then 
        xml = xmlLoadFile("data/coordinates.xml") 
        if xml then 
            children = xmlFindChild ( xml, "TERMINALPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    z = xmlNodeGetAttribute(v,"z") 
                    r = xmlNodeGetAttribute(v,"r") 
                    bank[i] = createMarker ( x, y, z, "cylinder", 2, 255, 153, 0, 170 ) 
                    terminal[i] = createObject (1863, x, y, z, 0, 0, r) 
                end 
                xmlUnloadFile(xml) 
            end 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), banks ) 
  

Link to comment

Ну у меня там мод большой, разбит на несколько файлов. Но во всех файлах, где есть открытие xml, примерно все так же написано. Вот еще кусок из другого файла.

  
addEventHandler ( "onClientResourceStart", getResourceRootElement(), function (res) 
    if res == getThisResource() then 
        local xml = xmlLoadFile("data/coordinates.xml") 
        if xml then 
            local children = xmlFindChild ( xml, "RADPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Gblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/cam.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "FUELPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Fblip[i] = exports.res2:createCustomBlip ( x, y, 15, 15, "files/fuell.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "RNPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Rblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car1.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "SNPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Sblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car2.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "GAIPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    GMblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car3.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "DBPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Dblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car4.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "BSPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    BSblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car5.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "SHPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    SHblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/uch.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "TAXIPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    Tblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/taxi.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "GARAGEPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    GRblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/garage.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "GRPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    GZblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/gruz.png" ) 
                end 
            end 
            children = nil 
            local children = xmlFindChild ( xml, "TERMINALPoints", 0 ) 
            if children then 
                for i,v in ipairs(xmlNodeGetChildren(children)) do 
                    x = xmlNodeGetAttribute(v,"x") 
                    y = xmlNodeGetAttribute(v,"y") 
                    TMblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/term.png" ) 
                end 
            end 
            children = nil 
        end 
        xmlUnloadFile(xml) 
        xml = nil 
    end 
end) 
  

Link to comment

Насколько я понимаю, вы используете ХМL в качестве базы данных для координат. Кроме того, что координаты можно хранить и в самом скрипте, так вы еще их берете из клиентских файлов ХМL, которые легко можно изменить любому игроку и тогда ваши блипы или что у вас там еще будут создаваться в любой точке, которую захочет игрок, или вообще не будут если написать там что угодно. Уже не говоря о том, что использование XML для хранения больших объемов данных вообще недопустимо. Поправьте если неправ.

Link to comment
Насколько я понимаю, вы используете ХМL в качестве базы данных для координат. Кроме того, что координаты можно хранить и в самом скрипте, так вы еще их берете из клиентских файлов ХМL, которые легко можно изменить любому игроку и тогда ваши блипы или что у вас там еще будут создаваться в любой точке, которую захочет игрок, или вообще не будут если написать там что угодно. Уже не говоря о том, что использование XML для хранения больших объемов данных вообще недопустимо. Поправьте если неправ.

ну проблем с работой я не наблюдал, просто в performancebrowser'е со временем работы сервера кол-во открытых xml постоянно пополняется.

Link to comment
  • 2 months later...

Нет, у него есть unload, а ты говоришь о сохранении, т.е. сохранит, но не выгрузит.

Не особо обратил внимания когда увидел первый раз.

а) Локальными лучше, но проблема не в них, он в одной функции выгружает.

б) Этого кода достаточно что-бы понять проблему.

в) Что-бы утверждать что изменить xml легко, нужно видеть мету. Кроме того дать возможность игроку, так выделиться, не будет лишним, вдруг получит бан, крик его успокоить, не баня в группе/сайте, только хешем фиксировать изменение и все.

Почему не выгружалось, да потому-что если необходимо безусловно выгружать, то нужно так и делать. Т.е. вначале конструкции загрузка, в конце выгрузка. А если выгрузка, внутри вложенных, то она же может и не выполниться, не обязан же потомок существовать. Просто нужно было unload, на уровень выше поставить и все.

Кроме того пару советов к такого рода коду.

Не зачем писать длинный одинаковый код, раз уж храните координаты, храните и то чего это координаты, и сделайте для множества один код. Меньше кода - легче ориентироваться.

Статистика хороша, но можно собрать статистику вызовов конкретных xml и потомков(child). Потому-что может быть так, что нет никакой выгоды от выгрузки файла, т.к. там какие-то периоды нагрузки есть. Далее выгрузка может понадобиться не сразу, а регулярно, можно собирать их все в одну таблицу, и далее регулярно очищать. Но стоит отметить что нагрузка на клиента вас может особо и не волновать.

Код привязанный к клиентскому ивенту, можно выполнять и с сервера.

triggerServerEvent() 
--или через 
call() 
  

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...