PHP တွင် XML ဖိုင်များကိုထုတ်ယူခြင်းသည်ဘုံလုပ်ငန်းတစ်ခုဖြစ်ပြီး XML_Parse () သည်ထိုကဲ့သို့သောအချက်အလက်များကိုလုပ်ဆောင်ရန်အတွက်ဘုံလုပ်ဆောင်မှုတစ်ခုဖြစ်သည်။ သို့သော်စူပါကြီးမားသော XML ဖိုင်များ (ဥပမာ Megabytes သို့မဟုတ်ရာနှင့်ချီသော megabytes များကဲ့သို့) နှင့်ကြုံတွေ့ရသောအခါစွမ်းဆောင်ရည်အဟန့်အတားများကိုဖော်ထုတ်လိမ့်မည်။ ဤဆောင်းပါးသည် XML_Parse () ၏နိယာမကိုလေ့လာရန် XML_Parse () နှင့်ပိုမိုကောင်းမွန်သော XML ဖိုင်များနှင့်ဆက်ဆံရာတွင်ပိုမိုကောင်းမွန်စေရန်မဟာဗျူဟာများစွာကိုလေ့လာလိမ့်မည်။
XML_Parse () function သည်ဖြစ်ရပ်မှန်အခြေပြု XML parser (i.e. expat) တွင်မူတည်သည်။ ၎င်းသည်အသေးစားသို့မဟုတ်အလတ်စား XML ဖိုင်များတွင်ကောင်းမွန်စွာလုပ်ဆောင်သော်လည်း XML ဖိုင်များနှင့်အလုပ်လုပ်စဉ်အောက်ပါပြ problems နာများဖြစ်ပေါ်နိုင်သည်။
ကြီးမားသောမှတ်ဉာဏ်သုံးစွဲမှု
parsing မြန်နှုန်းနှေးကွေး
မြင့်မားသော CPU အသုံးပြုမှု
I / o ပိတ်ဆို့ခြင်းသည်စနစ်တုံ့ပြန်မှုနှေးကွေးစေသည်
ပြ problems နာအများစုကိုအောက်ပါအချက်များနှင့် ဆက်စပ်. ဖော်ပြနိုင်သည်။
XML ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းဖတ်ခြင်းသည်မှတ်ဉာဏ်ဖိအားကိုဖန်တီးပေးသည်။
streaming ကိုအပြည့်အဝအသုံးချရန်အပြောင်းအလဲနဲ့ယုတ္တိဗေဒသည်ဗဟိုသို့မဟုတ်ထပ်တူပြုခြင်းကိုထပ်တူပြုသည်။
callback function ကိုမလျော်ကန်စွာကိုင်တွယ်သည်, စွမ်းဆောင်ရည်စွန့်ပစ်ပစ္စည်းများကိုဖြစ်ပေါ်စေသည်။
Parser အရင်းအမြစ်များကိုသန့်ရှင်းရေးသို့မဟုတ်ပြန်လည်အသုံးပြုခြင်းမရှိပါ။
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);
ဤအရာကိုအားသာချက်မှာမှတ်ဉာဏ်ခြေရာသည်အမြဲတမ်းထိန်းချုပ်နိုင်စွမ်းရှိပြီးဖိုင်သည်ကြီးမားလျှင်ပင်အကြောင်းအရာအားလုံးကိုတစ်ချိန်တည်းတွင်တင်လိမ့်မည်မဟုတ်ပါ။
မှတ်ပုံတင်ထားသော 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);
}
}
XML_Parse () ကိုစဉ်ဆက်မပြတ်အသုံးပြုခြင်းသည်သီးခြားမှတ်ဥာဏ်ပြ issues နာများကိုဖြစ်ပေါ်စေနိုင်သည်။ XML_Parser_Free_Free () ကို သုံးရန်သေချာစေရန်နှင့်လိုအပ်ပါကကမ္ဘာလုံးဆိုင်ရာ variable များကိုရှင်းလင်းရန်သေချာပါစေ။
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();
optimization အကျိုးသက်ရောက်မှုကိုတွက်ချက်နိုင်ရန်အတွက်စစ်ဆေးရန်အောက်ပါနည်းလမ်းကိုအသုံးပြုရန်အကြံပြုသည်။
မှတ်ဉာဏ်နှင့်အချိန်စားသုံးမှုကိုမှတ်တမ်းတင်ရန် memory_get_get_eusage () နှင့် Microtime () ကိုသုံးပါ
ကြိုး သို့မဟုတ် xdebug နှင့်အတူ system ခေါ်ဆိုမှုနှင့် bottlenecks ခြေရာခံ
တစ်ကြိမ်တင်ခြင်းနှင့် chunking processing အကြားအရင်းအမြစ်နေရာများတွင်ခြားနားချက်ကိုနှိုင်းယှဉ်
စူပါကြီးမားသော XML ဖိုင်များကိုလုပ်ဆောင်သည့်အခါ XML_Parse ကို အကောင်းဆုံးရွေးချယ်ရန်သော့ချက်သည် " ထိန်းချုပ်မှုအရင်းအမြစ်သုံးစွဲမှု + streamline processing logic " ဖြစ်သည်။ chunked စာဖတ်ခြင်းနှင့်ပါးလွှာသော callbacks အသုံးပြုခြင်းကို ဦး စားပေးရန်အကြံပြုထားပြီး,
အကြံပြုပေါင်းစပ်:
အထွေထွေတာဝန်များအတွက် XML_Parse () +) + fread () + callback simplification
ကြီးမားသောဒေတာခွဲခြမ်းစိတ်ဖြာမှုအတွက် - XMLReader + နှောင့်နှေးခြင်းနှင့်နှောင့်နှေးခြင်း + အသုတ်ချွေတာခြင်း
ကျိုးကြောင်းဆီလျော်သောအကောင်းမြင်ခြင်းဖြင့် XML ဖိုင်များ MB နှင့်ရင်ဆိုင်ရသည့်အခါ၌ပင်ထိရောက်သောတည်ငြိမ်မှုဖြစ်စဉ်တစ်ခုရရှိနိုင်ပါသည်။