လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> XML_Parse စွမ်းဆောင်ရည်မြှင့်တင်ခြင်းများနှင့် optimizations super ကြီးမားသော XML ဖိုင်များကိုကိုင်တွယ်သည့်အခါ

XML_Parse စွမ်းဆောင်ရည်မြှင့်တင်ခြင်းများနှင့် optimizations super ကြီးမားသော XML ဖိုင်များကိုကိုင်တွယ်သည့်အခါ

M66 2025-04-25

PHP တွင် XML ဖိုင်များကိုထုတ်ယူခြင်းသည်ဘုံလုပ်ငန်းတစ်ခုဖြစ်ပြီး XML_Parse () သည်ထိုကဲ့သို့သောအချက်အလက်များကိုလုပ်ဆောင်ရန်အတွက်ဘုံလုပ်ဆောင်မှုတစ်ခုဖြစ်သည်။ သို့သော်စူပါကြီးမားသော XML ဖိုင်များ (ဥပမာ Megabytes သို့မဟုတ်ရာနှင့်ချီသော megabytes များကဲ့သို့) နှင့်ကြုံတွေ့ရသောအခါစွမ်းဆောင်ရည်အဟန့်အတားများကိုဖော်ထုတ်လိမ့်မည်။ ဤဆောင်းပါးသည် XML_Parse () ၏နိယာမကိုလေ့လာရန် XML_Parse () နှင့်ပိုမိုကောင်းမွန်သော XML ဖိုင်များနှင့်ဆက်ဆံရာတွင်ပိုမိုကောင်းမွန်စေရန်မဟာဗျူဟာများစွာကိုလေ့လာလိမ့်မည်။

1 ။ ပြ problem နာခြုံငုံသုံးသပ်ချက်

XML_Parse () function သည်ဖြစ်ရပ်မှန်အခြေပြု XML parser (i.e. expat) တွင်မူတည်သည်။ ၎င်းသည်အသေးစားသို့မဟုတ်အလတ်စား XML ဖိုင်များတွင်ကောင်းမွန်စွာလုပ်ဆောင်သော်လည်း XML ဖိုင်များနှင့်အလုပ်လုပ်စဉ်အောက်ပါပြ problems နာများဖြစ်ပေါ်နိုင်သည်။

  • ကြီးမားသောမှတ်ဉာဏ်သုံးစွဲမှု

  • parsing မြန်နှုန်းနှေးကွေး

  • မြင့်မားသော CPU အသုံးပြုမှု

  • I / o ပိတ်ဆို့ခြင်းသည်စနစ်တုံ့ပြန်မှုနှေးကွေးစေသည်

2 ။ ခွဲခြမ်းစိတ်ဖြာခြင်းဖြစ်ပေါ်စေသည်

ပြ problems နာအများစုကိုအောက်ပါအချက်များနှင့် ဆက်စပ်. ဖော်ပြနိုင်သည်။

  • XML ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းဖတ်ခြင်းသည်မှတ်ဉာဏ်ဖိအားကိုဖန်တီးပေးသည်။

  • streaming ကိုအပြည့်အဝအသုံးချရန်အပြောင်းအလဲနဲ့ယုတ္တိဗေဒသည်ဗဟိုသို့မဟုတ်ထပ်တူပြုခြင်းကိုထပ်တူပြုသည်။

  • callback function ကိုမလျော်ကန်စွာကိုင်တွယ်သည်, စွမ်းဆောင်ရည်စွန့်ပစ်ပစ္စည်းများကိုဖြစ်ပေါ်စေသည်။

  • Parser အရင်းအမြစ်များကိုသန့်ရှင်းရေးသို့မဟုတ်ပြန်လည်အသုံးပြုခြင်းမရှိပါ။

3 ။ ပိုကောင်းအောင်မဟာဗျူဟာ

3.1 streaming စာဖတ်ခြင်းနည်းလမ်း (chunk chunk analysis) ကိုသုံးပါ။

XML ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းတင်မည့်အစား XML content ကိုအပိုင်းအစများတွင်ဖတ်ရန် fopen နှင့် Thead ကို အသုံးပြု. တစ်ကြိမ်လျှင်အကြောင်းအရာများ၏သေးငယ်သောအစိတ်အပိုင်းကိုသာအစာကျွေးသည်။

 $parser = xml_parser_create();

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

$fp = fopen("https://m66.net/files/large-xml-file.xml", "r");
if (!$fp) {
    die("ဖွင့်လို့မရဘူး XML စာချုပ်စာတမ်း");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($parser, $data, feof($fp))) {
        die(sprintf("XML အမှား: %s လုပ်ငန်းစဉ်၌ %d",
            xml_error_string(xml_get_error_code($parser)),
            xml_get_current_line_number($parser)));
    }
}

xml_parser_free($parser);
fclose($fp);

ဤအရာကိုအားသာချက်မှာမှတ်ဉာဏ်ခြေရာသည်အမြဲတမ်းထိန်းချုပ်နိုင်စွမ်းရှိပြီးဖိုင်သည်ကြီးမားလျှင်ပင်အကြောင်းအရာအားလုံးကိုတစ်ချိန်တည်းတွင်တင်လိမ့်မည်မဟုတ်ပါ။

3.2 callback function ကို optimize လုပ်ပါ

မှတ်ပုံတင်ထားသော callback function ၏ Execution ထိရောက်မှုသည်ယေဘုယျခွဲခြမ်းစိတ်ဖြာနှုန်းကိုသက်ရောက်သည်။ ရှုပ်ထွေးသောယုတ္တိဗေဒသို့မဟုတ်မကြာခဏနှေးကွေးသော i / o / o / o / o / o / o / o / o စစ်ဆင်ရေးများကိုရှောင်ရှားရန်ကြိုးစားခြင်းကိုရှောင်ကြဉ်ပါ။

 function startElement($parser, $name, $attrs) {
    // ရိုးရှင်းသောယုတ္တိဗေဒ,အပိုတရားစီရင်ခြင်းသို့မဟုတ်အသိုက်ကိုရှောင်ကြဉ်ပါ
    if ($name === "ITEM") {
        // လိုအပ်သောဒေတာနယ်ပယ်များကိုသာမှတ်တမ်းတင်ပါ
        global $currentItem;
        $currentItem = [];
    }
}

function characterData($parser, $data) {
    global $currentItem;
    $data = trim($data);
    if (!empty($data)) {
        $currentItem[] = $data;
    }
}

function endElement($parser, $name) {
    global $currentItem;
    if ($name === "ITEM") {
        // နှောင့်နှေးအပြောင်းအလဲနဲ့သို့မဟုတ် cache ကိုချွေတာရလဒ်များ
        // saveToDatabase($currentItem); // asnchronous သို့မဟုတ် batch အပြောင်းအလဲနဲ့ပိုကောင်းတယ်
        // နမူနာအပြောင်းအလဲနဲ့ကုဒ်:
        file_put_contents("/tmp/parsed-items.log", json_encode($currentItem) . "\n", FILE_APPEND);
    }
}

3.3 မှတ်ဉာဏ်ယိုစိမ့်မှုကိုရှောင်ပါ

XML_Parse () ကိုစဉ်ဆက်မပြတ်အသုံးပြုခြင်းသည်သီးခြားမှတ်ဥာဏ်ပြ issues နာများကိုဖြစ်ပေါ်စေနိုင်သည်။ XML_Parser_Free_Free () ကို သုံးရန်သေချာစေရန်နှင့်လိုအပ်ပါကကမ္ဘာလုံးဆိုင်ရာ variable များကိုရှင်းလင်းရန်သေချာပါစေ။

3.4 အခြား plansers (ဥပမာ xmlreader ကဲ့သို့သော parsers)

XML_Parse သည် ဖြစ်ရပ် - မောင်းနှင်သောခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်သင့်တော်သော်လည်း PHP ၏ XMLReader သည် ပိုမိုခေတ်မီသောနည်းလမ်းကိုထောက်ပံ့ပေးသည်,

 $reader = new XMLReader();
$reader->open("https://m66.net/files/large-xml-file.xml");

while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == "item") {
        $node = $reader->readOuterXML();
        // ကိုင်တွယ်ဖြေရှင်းသည် item node
    }
}

$reader->close();

4 ။ စွမ်းဆောင်ရည်စမ်းသပ်ခြင်းအကြံပြုချက်များ

optimization အကျိုးသက်ရောက်မှုကိုတွက်ချက်နိုင်ရန်အတွက်စစ်ဆေးရန်အောက်ပါနည်းလမ်းကိုအသုံးပြုရန်အကြံပြုသည်။

  • မှတ်ဉာဏ်နှင့်အချိန်စားသုံးမှုကိုမှတ်တမ်းတင်ရန် memory_get_get_eusage () နှင့် Microtime () ကိုသုံးပါ

  • ကြိုး သို့မဟုတ် xdebug နှင့်အတူ system ခေါ်ဆိုမှုနှင့် bottlenecks ခြေရာခံ

  • တစ်ကြိမ်တင်ခြင်းနှင့် chunking processing အကြားအရင်းအမြစ်နေရာများတွင်ခြားနားချက်ကိုနှိုင်းယှဉ်

5 ။ အကျဉ်းချုပ်

စူပါကြီးမားသော XML ဖိုင်များကိုလုပ်ဆောင်သည့်အခါ XML_Parse ကို အကောင်းဆုံးရွေးချယ်ရန်သော့ချက်သည် " ထိန်းချုပ်မှုအရင်းအမြစ်သုံးစွဲမှု + streamline processing logic " ဖြစ်သည်။ chunked စာဖတ်ခြင်းနှင့်ပါးလွှာသော callbacks အသုံးပြုခြင်းကို ဦး စားပေးရန်အကြံပြုထားပြီး,

အကြံပြုပေါင်းစပ်:

  • အထွေထွေတာဝန်များအတွက် XML_Parse () +) + fread () + callback simplification

  • ကြီးမားသောဒေတာခွဲခြမ်းစိတ်ဖြာမှုအတွက် - XMLReader + နှောင့်နှေးခြင်းနှင့်နှောင့်နှေးခြင်း + အသုတ်ချွေတာခြင်း

ကျိုးကြောင်းဆီလျော်သောအကောင်းမြင်ခြင်းဖြင့် XML ဖိုင်များ MB နှင့်ရင်ဆိုင်ရသည့်အခါ၌ပင်ထိရောက်သောတည်ငြိမ်မှုဖြစ်စဉ်တစ်ခုရရှိနိုင်ပါသည်။