XML ဖိုင်ကြီးများနှင့်ဆက်ဆံရာတွင် PHP မှပေးသော XML_Parse function သည် (Expat parser အပေါ်အခြေခံသည်) သည်ထိရောက်သောနည်းလမ်းဖြစ်သည်။ သို့သော်မသင့်လျော်သောမှတ်ဥာဏ်စီမံခန့်ခွဲမှုကြောင့် XML ဖိုင်များ၏ Megabytes နှင့်ရာနှင့်ချီသော megabytes များပြုလုပ်သောအခါ, ဤဆောင်းပါးသည် XML_Parse ၏မှတ်ဉာဏ်စီမံခန့်ခွဲမှုအပေါ်ရှုထောင့်မှကြည့်ရှုခြင်းမှ XML ဖိုင်၏စွမ်းဆောင်ရည်နှင့်တည်ငြိမ်မှုကိုမည်သို့တိုးတက်အောင်လုပ်ရမည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။
XML သည်ဘုံဒေတာဖလှယ်ပုံစံဖြစ်သည်။ အီးဖြင့်ကူးသန်းရောင်းဝယ်ရေး, ထောက်ပံ့ပို့ဆောင်ရေး, အကြောင်းအရာစုစည်းခြင်းစသည့်စနစ်များစွာကိုအသုတ်တွင်တင်သွင်းရန်သို့မဟုတ်တင်ပို့ရန်အတွက် XML ကိုမှီခိုခြင်းစသည်တို့ပါဝင်သည်။ သို့သော် PHP သည် XML ဖိုင်များကိုကြီးမားစွာခွဲခြမ်းစိတ်ဖြာသောအခါဖိုင်တစ်ခုလုံးကိုတစ်ချိန်တည်းတွင်မှတ်ဉာဏ်သို့စာဖတ်ခြင်းကိုဖတ်ပါ။
ဥပမာအားဖြင့်:
$xml = file_get_contents('https://m66.net/data/huge.xml');
$parser = xml_parser_create();
xml_parse($parser, $xml, true);
xml_parser_free($parser);
အထက်ပါကုဒ်သည် Php.ini တွင် Memory_Limit ကို သတ်မှတ်ထားသည့်ဆာဗာပတ်ဝန်းကျင်တွင်ကွန်ပျူတာများကိုပြုပြင်သည့်အခါအထက်ပါကုဒ်များသည်မှတ်ဥာဏ်လျှံကိုအလွယ်တကူဖြစ်ပေါ်စေနိုင်သည်။
XML ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းဖတ်ရှုခြင်းနှင့်နှိုင်းယှဉ်လျှင် XML_Parse () နှင့်ပေါင်းစပ်ထားသော fopen () နှင့် အရူးအမူး () () နှင့်ပေါင်းစပ်ထားသော incremental parsing နည်းလမ်းကိုအသုံးပြုရန်အကြံပြုသည်။ ၎င်းသည်မှတ်ဥာဏ်အသုံးပြုမှုကိုသိသိသာသာလျှော့ချနိုင်သည်။
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
$fp = fopen("https://m66.net/data/huge.xml", "r");
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
}
fclose($fp);
xml_parser_free($parser);
Memory Management သည်အချက်အလက်များကို callback function များဖြင့်အချက်အလက်သိုလှောင်မှုကိုဖြေရှင်းရန်လိုအပ်သည်။ XML သစ်ပင်တစ်ခုလုံးကိုမှတ်ဉာဏ်သို့မမှတ်ထားပါနှင့်, အသုံးဝင်သောသတင်းအချက်အလက်များကိုထုတ်ယူပြီးနောက်ချက်ချင်းဒေတာဘေ့စ်သို့ရေးရန်သို့မဟုတ်ရေးရန်ရွေးချယ်သင့်သည်။
function startElement($parser, $name, $attrs) {
if ($name === 'ITEM') {
// သော့ချက်စာလုံးများကိုသာထုတ်ယူပါ
global $currentItem;
$currentItem = [];
}
}
function endElement($parser, $name) {
global $currentItem;
if ($name === 'ITEM') {
// အပြောင်းအလဲနဲ့ပြီးနောက်ချက်ချင်းသန့်ရှင်းရေး
processItem($currentItem);
unset($currentItem);
}
}
function processItem($item) {
// နမူနာ:ချက်ချင်းဒေတာဘေ့စ်သို့မဟုတ် output ကိုရေးပါ
file_put_contents('/tmp/items.txt', json_encode($item) . PHP_EOL, FILE_APPEND);
}
ဇာတ်လမ်းမှတ်ဉာဏ်ကန့်သတ်ချက်နှင့်ကွပ်မျက်မှုအချိန်သည်လုပ်ငန်းစဉ်အတွင်းကြားဖြတ်နှောင့်ယှက်မှုများမှရှောင်ရှားရန်ကုဒ်မှတဆင့် code မှတဆင့် code မှတဆင့်ပိုမိုမြင့်မားနိုင်ပါသည်:
ini_set('memory_limit', '512M');
set_time_limit(0);
သို့သော်ဤအချက်သည်ပြ the နာအတွက်အခြေခံကျသောအဖြေမဟုတ်ကြောင်း ကျေးဇူးပြု. မှတ်သားပါ, ၎င်းသည်ဖိုင်အနည်းငယ်ပိုကြီးသည့်အခြေအနေများနှင့်သက်ဆိုင်သည်။ သို့သော်ဖွဲ့စည်းပုံသည်ကျိုးကြောင်းဆီလျော်သည်။
SAX parsing mode ကိုအသုံးပြုခြင်း - XML parser ကိုယ်တိုင်ကဖြစ်ရပ်မှန်ကိုမောင်းနှင်ခြင်း, ဒါကိုအားသာချက်ယူပြီးဒီအားသာချက်ကိုယူပြီးအခွင့်ကောင်းယူပြီးမှတ်ဉာဏ်ကိုချွေတာခြင်းကိုရှောင်ရှားနိုင်သည်။
Sharding processing + breakpoint စဉ်ဆက်မပြတ်စာဖတ်ခြင်း - သီးခြား XML ဖိုင်များအတွက် (ပစ္စည်းတစ်ခုစီသည်လွတ်လပ်သော data item item item item) အတွက်သင်၏အခြေအနေကိုသိမ်းထားနိုင်သည်။
အချက်အလက်များကိုလုပ်ဆောင်ရန်အတွက်မီးစက်ထုတ်လုပ်ရန် PHP Generator ( အထွက်နှုန်း ) ကို XML callocating forctions များဖြင့်အသုံးပြုနိုင်သည်။
XML ဖိုင်များကိုပြုပြင်ခြင်း၏အဓိကအချက်မှာ "ဖိုင်အပြည့်အစုံ" နှင့် "အချက်အလက်အပြည့်အစုံကိုသိုလှောင်ခြင်းမှရှောင်ရှားရန်ဖြစ်သည်။ XML_Parse သည် စာဖတ်ခြင်း, လက်ငင်းအချက်အလက်ပြုပြင်ခြင်းနှင့်မှတ်ဉာဏ်အထွတ်အထိပ်ထိန်းချုပ်မှုနှင့်ပေါင်းစပ်ခြင်းဖြင့်ပေါင်းစပ်ထားသော XML parsing ဖြေရှင်းချက်ကိုကျွန်ုပ်တို့ရရှိနိုင်ပါသည်။
၎င်းသည်တစ်ခုတည်းခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်သင့်လျော်သည်သာမကပုံမှန်သွင်းကုန်လိုအပ်သည့်နောက်ခံအလုပ်အခြေအနေများအတွက်လည်းဖြစ်သည်။ ဤဆောင်းပါးတွင် optimization အတွေးအခေါ်များသည်သင့်အား XML ဖိုင်များကိုအလွယ်တကူကိုင်တွယ်နိုင်ရန်ကူညီနိုင်သည်ဟုကျွန်ုပ်မျှော်လင့်ပါသည်။