လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> xml_parse မှတစ်ဆင့်ချည်မျှင်ပေါင်းစုံ parsing xml ဖိုင်များကိုမည်သို့အကောင်အထည်ဖော်ရမည်နည်း

xml_parse မှတစ်ဆင့်ချည်မျှင်ပေါင်းစုံ parsing xml ဖိုင်များကိုမည်သို့အကောင်အထည်ဖော်ရမည်နည်း

M66 2025-04-26

ကြီးမားသော XML ဖိုင်များဖြင့်အလုပ်လုပ်စဉ်တစ် ဦး တည်းသော parsing သည်မှတ်ဥာဏ်အသုံးပြုမှုသို့မဟုတ်အလွန်အကျွံကွပ်မျက်ခြင်းအချိန်အလွန်အကျွံသုံးစွဲမှုကိုဖြစ်စေနိုင်သည်။ PHP ကိုယ်တိုင်က "အင်္ဂါ jour or swoole ကဲ့သို့သော extensions များအသုံးပြုခြင်းမဟုတ်လျှင်" Pholeds + sproole ကဲ့သို့သော extensions) ကိုမထောက်ပံ့ပါ

XML_Parse-trat_open ကိုအကောင်အထည်ဖော်ရန် XML_Parse function function နှင့် proc_open ကို မည်သို့ပေါင်းစပ်ရမည်ကိုသရုပ်ပြပါလိမ့်မည်။

1 ။ XML_PLESSE ကို အဘယ်ကြောင့်ရွေးချယ်ရသနည်း။

XML_Parse သည် PHP ၏အခြေခံ parsing လုပ်ငန်းဆောင်တာများထဲမှတစ်ခုဖြစ်သည်။ Expat parser ၏အစိတ်အပိုင်းဖြစ်သည်။ ၎င်းသည်ဖြစ်ရပ်-based parsing ကိုထောက်ပံ့ပေးပြီးကြီးမားသော XML data streams များကိုလွှင့်ရန်ဖြစ်သည်။ XML_Pars သည် စာရွက်စာတမ်းတစ်ခုလုံးကိုမှတ်ဉာဏ်ထဲသို့ 0 င်ရောက်ခြင်းထက်အရင်းအမြစ်များကိုသိုလှောင်သည်။

2 ။ multithreading အတွက် simulating များအတွက်အခြေခံစိတ်ကူးများ

Threads မျိုးစုံကို XML_Parser အရာဝတ်ထုကိုတိုက်ရိုက်မျှဝေခွင့်မပြုနိုင်ပါ။

  1. ကြီးမားသော XML ဖိုင်များကို (node ​​ဖြင့်ခွဲခြားခြင်း) ကိုပိတ်ပါ

  2. PHP ကလေးငယ်များအားစတင်ရန် proc_open () သို့မဟုတ် shell_exec () ကို သုံးပါ။

  3. ကလေးဖြစ်စဉ်တစ်ခုစီသည်၎င်း၏ကိုယ်ပိုင် XML block ကိုခွဲခြမ်းစိတ်ဖြာသည်။

  4. အဓိကလုပ်ငန်းစဉ်သည်ရလဒ်များကိုစုဆောင်းပြီးသူတို့ကိုပေါင်းစည်းသည်။

3 ။ PHP အကောင်အထည်ဖော်မှုဥပမာ

ကျွန်ုပ်တို့တွင်အောက်ပါဖွဲ့စည်းပုံနှင့်အတူ xml file ကြီးမားတဲ့ XML file တစ်ခုရှိသည်ဆိုပါစို့။

 <items>
  <item><id>1</id><name>Item 1</name></item>
  <item><id>2</id><name>Item 2</name></item>
  ...
</items>

1 ။ အဓိကလုပ်ငန်းစဉ် (Master.php)

 <?php

$sourceFile = '/data/huge.xml';
$tempDir = '/tmp/xml_chunks/';
$chunkSize = 1000; // တစ်ခုချင်းစီကိုကလေးလုပ်ငန်းစဉ်ခွဲခြမ်းစိတ်ဖြာ 1000 မရေွှးသော <item>
$urls = [];

// ယာယီလမ်းညွှန်တည်ရှိသေချာပါစေ
if (!is_dir($tempDir)) {
    mkdir($tempDir, 0777, true);
}

// ကွဲ XML စာချုပ်စာတမ်း
$handle = fopen($sourceFile, 'r');
$chunkIndex = 0;
$buffer = '';
$itemCount = 0;

while (($line = fgets($handle)) !== false) {
    if (strpos($line, '<item>') !== false) {
        $itemCount++;
    }

    $buffer .= $line;

    if ($itemCount >= $chunkSize || feof($handle)) {
        $chunkFile = $tempDir . "chunk_{$chunkIndex}.xml";
        file_put_contents($chunkFile, "<items>\n" . $buffer . "\n</items>");
        $urls[] = "http://m66.net/worker.php?file=" . urlencode($chunkFile);
        $chunkIndex++;
        $buffer = '';
        $itemCount = 0;
    }
}

fclose($handle);

// အပြိုင်ခေါ်ဆိုမှု worker မိစ်ဆာ(ပြောင်းလဲနိုင်ပါတယ် curl_multi_exec တိုးတက်မှုကိုတိုးတက်စေသည်)
foreach ($urls as $url) {
    shell_exec("php worker.php '{$url}' > /dev/null &");
}

echo "စတင်ခဲ့သည် " . count($urls) . " မရေွှးသော解析任务。\n";

2 ။ subprocess script (worker .php)

 <?php

if ($argc < 2) {
    exit("ကျေးဇူးပြုပြီးသွားပါ XML စာချုပ်စာတမ်း路径参数\n");
}

$xmlFile = urldecode($argv[1]);

if (!file_exists($xmlFile)) {
    exit("စာချုပ်စာတမ်း不存在: $xmlFile\n");
}

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

$currentTag = '';
$currentItem = [];

function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = strtolower($name);
}

function endElement($parser, $name) {
    global $currentTag, $currentItem;

    if (strtolower($name) == 'item') {
        // နမူနာ:将解析结果保存到စာချုပ်စာတမ်း或数据库
        file_put_contents('/tmp/parsed_result.txt', json_encode($currentItem) . PHP_EOL, FILE_APPEND);
        $currentItem = [];
    }

    $currentTag = '';
}

function characterData($parser, $data) {
    global $currentTag, $currentItem;

    if (trim($data)) {
        $currentItem[$currentTag] = trim($data);
    }
}

$fp = fopen($xmlFile, 'r');
while ($data = fread($fp, 4096)) {
    xml_parse($parser, $data, feof($fp)) or
        die(sprintf("XML အမှား: %s", xml_error_string(xml_get_error_code($parser))));
}
fclose($fp);
xml_parser_free($parser);

echo "ခွဲခြမ်းစိတ်ဖြာခြင်းပြီးစီးခဲ့သည်: $xmlFile\n";

4 ။ စွမ်းဆောင်ရည်နှင့်ကြိုတင်ကာကွယ်မှုများ

  • စွမ်းဆောင်ရည်တိုးတက်မှု - Multi-Core CPUs တွင်ကလေးဖြစ်စဉ်တစ်ခုစီသည်လွတ်လပ်စွာလည်ပတ်နိုင်ပြီးအပြိုင် paraling speed ကိုအရှိန်မြှင့်နိုင်သည်။

  • Memory Control - ကလေးတစ် ဦး စီ၏လုပ်ငန်းစဉ်တစ်ခုစီမှပြုလုပ်သောအချက်အလက်ပမာဏသည်မှတ်ဥာဏ်ကိုစားရန်ရှောင်ရှားရန်ထိန်းချုပ်နိုင်သည်။

  • လုံခြုံရေး - ဖိုင်လမ်းကြောင်းကို URL Parameters သည် URL parameters များကိုတိုက်ရိုက်မသွားနိုင်အောင်ထုတ်လုပ်မှုပတ် 0 န်းကျင်ရှိ URL parameter များကိုတိုက်ရိုက်မဖြတ်နိုင်ပါ။

  • Process Management : သင်ပိုမိုတည်ငြိမ်သောကလေးဖြစ်စဉ်စီမံခန့်ခွဲမှုရရှိရန် Shell_exec ကို အစားထိုးရန် PCNTL_EXEN သို့မဟုတ် SWOOLE ကို သင်အသုံးပြုနိုင်သည်။

V. နိဂုံးချုပ်

PHP ကိုယ်တိုင်သည်တစ်ပြိုင်နက်တည်းပြုပြင်ခြင်းအတွက်အကောင်းဆုံးသောဘာသာစကားမဟုတ်သော်လည်း XML_Parse နှင့် Process Control Techniques မှတစ်ဆင့်ကျွန်ုပ်တို့သည်ကြီးမားသော XML ဖိုင်များကိုထိရောက်စွာခွဲခြမ်းစိတ်ဖြာနိုင်ဆဲဖြစ်သည်။ ဤနည်းလမ်းသည် log processing နှင့် data intack ကဲ့သို့သောစွမ်းဆောင်ရည်လိုအပ်သည့် task scarios များအတွက်အထူးသဖြင့်သင့်လျော်သည်။

ထပ်မံတိုးတက်မှုများလိုအပ်ပါက Go / Python ကဲ့သို့သော feartencency-friends ည့်သည်များအတွက်ခွဲခြမ်းစိတ်ဖြာမှု module ကိုပြန်လည်ရေးရန်အကြံပြုသည်။ ထို့နောက် PHP မှတစ်ဆင့်စီစဉ်ထားသည်။