ကြီးမားသော XML ဖိုင်များဖြင့်အလုပ်လုပ်စဉ်တစ် ဦး တည်းသော parsing သည်မှတ်ဥာဏ်အသုံးပြုမှုသို့မဟုတ်အလွန်အကျွံကွပ်မျက်ခြင်းအချိန်အလွန်အကျွံသုံးစွဲမှုကိုဖြစ်စေနိုင်သည်။ PHP ကိုယ်တိုင်က "အင်္ဂါ jour or swoole ကဲ့သို့သော extensions များအသုံးပြုခြင်းမဟုတ်လျှင်" Pholeds + sproole ကဲ့သို့သော extensions) ကိုမထောက်ပံ့ပါ ။
XML_Parse-trat_open ကိုအကောင်အထည်ဖော်ရန် XML_Parse function function နှင့် proc_open ကို မည်သို့ပေါင်းစပ်ရမည်ကိုသရုပ်ပြပါလိမ့်မည်။
XML_Parse သည် PHP ၏အခြေခံ parsing လုပ်ငန်းဆောင်တာများထဲမှတစ်ခုဖြစ်သည်။ Expat parser ၏အစိတ်အပိုင်းဖြစ်သည်။ ၎င်းသည်ဖြစ်ရပ်-based parsing ကိုထောက်ပံ့ပေးပြီးကြီးမားသော XML data streams များကိုလွှင့်ရန်ဖြစ်သည်။ XML_Pars သည် စာရွက်စာတမ်းတစ်ခုလုံးကိုမှတ်ဉာဏ်ထဲသို့ 0 င်ရောက်ခြင်းထက်အရင်းအမြစ်များကိုသိုလှောင်သည်။
Threads မျိုးစုံကို XML_Parser အရာဝတ်ထုကိုတိုက်ရိုက်မျှဝေခွင့်မပြုနိုင်ပါ။
ကြီးမားသော XML ဖိုင်များကို (node ဖြင့်ခွဲခြားခြင်း) ကိုပိတ်ပါ ။
PHP ကလေးငယ်များအားစတင်ရန် proc_open () သို့မဟုတ် shell_exec () ကို သုံးပါ။
ကလေးဖြစ်စဉ်တစ်ခုစီသည်၎င်း၏ကိုယ်ပိုင် XML block ကိုခွဲခြမ်းစိတ်ဖြာသည်။
အဓိကလုပ်ငန်းစဉ်သည်ရလဒ်များကိုစုဆောင်းပြီးသူတို့ကိုပေါင်းစည်းသည်။
ကျွန်ုပ်တို့တွင်အောက်ပါဖွဲ့စည်းပုံနှင့်အတူ xml file ကြီးမားတဲ့ XML file တစ်ခုရှိသည်ဆိုပါစို့။
<items>
<item><id>1</id><name>Item 1</name></item>
<item><id>2</id><name>Item 2</name></item>
...
</items>
<?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";
<?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";
စွမ်းဆောင်ရည်တိုးတက်မှု - Multi-Core CPUs တွင်ကလေးဖြစ်စဉ်တစ်ခုစီသည်လွတ်လပ်စွာလည်ပတ်နိုင်ပြီးအပြိုင် paraling speed ကိုအရှိန်မြှင့်နိုင်သည်။
Memory Control - ကလေးတစ် ဦး စီ၏လုပ်ငန်းစဉ်တစ်ခုစီမှပြုလုပ်သောအချက်အလက်ပမာဏသည်မှတ်ဥာဏ်ကိုစားရန်ရှောင်ရှားရန်ထိန်းချုပ်နိုင်သည်။
လုံခြုံရေး - ဖိုင်လမ်းကြောင်းကို URL Parameters သည် URL parameters များကိုတိုက်ရိုက်မသွားနိုင်အောင်ထုတ်လုပ်မှုပတ် 0 န်းကျင်ရှိ URL parameter များကိုတိုက်ရိုက်မဖြတ်နိုင်ပါ။
Process Management : သင်ပိုမိုတည်ငြိမ်သောကလေးဖြစ်စဉ်စီမံခန့်ခွဲမှုရရှိရန် Shell_exec ကို အစားထိုးရန် PCNTL_EXEN သို့မဟုတ် SWOOLE ကို သင်အသုံးပြုနိုင်သည်။
PHP ကိုယ်တိုင်သည်တစ်ပြိုင်နက်တည်းပြုပြင်ခြင်းအတွက်အကောင်းဆုံးသောဘာသာစကားမဟုတ်သော်လည်း XML_Parse နှင့် Process Control Techniques မှတစ်ဆင့်ကျွန်ုပ်တို့သည်ကြီးမားသော XML ဖိုင်များကိုထိရောက်စွာခွဲခြမ်းစိတ်ဖြာနိုင်ဆဲဖြစ်သည်။ ဤနည်းလမ်းသည် log processing နှင့် data intack ကဲ့သို့သောစွမ်းဆောင်ရည်လိုအပ်သည့် task scarios များအတွက်အထူးသဖြင့်သင့်လျော်သည်။
ထပ်မံတိုးတက်မှုများလိုအပ်ပါက Go / Python ကဲ့သို့သော feartencency-friends ည့်သည်များအတွက်ခွဲခြမ်းစိတ်ဖြာမှု module ကိုပြန်လည်ရေးရန်အကြံပြုသည်။ ထို့နောက် PHP မှတစ်ဆင့်စီစဉ်ထားသည်။