大規模なXMLファイルをPHPで処理する場合、従来の解析方法( Simplexml_load_file()やdomdocumentなど)は、過度のメモリ使用量やパフォーマンスボトルネックなどの問題に簡単につながる可能性があります。対照的に、 XML_PARSE (Expatベースのイベント駆動型パーサー)を使用すると、大規模なXMLデータをより効率的に処理できます。この記事では、 XML_PARSEを使用して大規模なXMLファイルを効率的に処理し、いくつかの最適化技術とベストプラクティスを共有する方法について詳しく説明します。
XML_PARSEはイベントベースのXML解析方法であり、「ストリーミングパーサー」に属します。つまり、XMLファイル全体を一度にメモリにロードする代わりに、ラインごとに読み取り、特定のコールバック関数をトリガーしてXMLのタグ、プロパティなどに応答します。
数百MBまたはGBのXMLファイルを解析します。
低メモリ環境で実行されるシステム。
解析中にデータの処理が必要なシナリオ(データベースのインポート、リアルタイム処理など)。
XML_PARSER_CREATEとXML_PARSEを使用した基本的なプロセスの例を次に示します。
<?php
$parser = xml_parser_create();
// コールバック関数を設定します
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 大きなファイルを開きます
$fp = fopen("https://m66.net/data/largefile.xml", "r");
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);
// コールバック関数の例
function startElement($parser, $name, $attrs) {
// ラベル名に従ってロジックを処理できます
if ($name == "ITEM") {
echo "処理を開始します ITEM\n";
}
}
function endElement($parser, $name) {
if ($name == "ITEM") {
echo "aの終了処理 ITEM\n";
}
}
function characterData($parser, $data) {
// タグ内のテキストコンテンツを処理します
$trimmed = trim($data);
if (!empty($trimmed)) {
echo "データ: $trimmed\n";
}
}
?>
一度に大きなファイルを読み取らないでください<br> fread()を使用してループして、チャンクのファイルコンテンツを読み取り、メモリの爆発を避けます。
コールバック関数を合理的に使用します<br> コールバック関数、特にディスクI/Oまたはネットワークリクエストであまりにも多くの論理操作を実行しないでください。
適切にクリーングローバル変数<br> コールバック関数でグローバル変数の一時状態を使用する場合、タイムリーUnset()はメモリの漏れを防ぐことができます。
ストリーム処理ロジックを有効にします<br> データベース操作を組み合わせると、すべてのエンティティを収集してバッチするのではなく、各解析エンティティがすぐにデータベースに書き込まれます。
不要な機能をオフにします<BR> 名前空間要件がない場合、パフォーマンスを改善するために追加の名前空間解像度を回避できます。
コーディングの問題:XMLファイルエンコードがPHPファイルと一致していることを確認するか、 XML_PARSER_SET_OPTION($ PARSER、XML_OPTION_TARGET_ENCODING、 "UTF-8")を使用して設定を強制します。
エンティティの問題:エンティティリファレンスがXML( &nbsp;など)で使用されている場合、解析の例外を引き起こし、事前に処理する必要があるか、エンティティの交換が有効になる場合があります。
エラー処理: XML_ERROR_STRING()およびXML_GET_CURRENT_LINE_NUMBER()によって提供されるタイムリーなキャプチャおよび印刷エラー情報。
XML_PARSEを使用して大規模なXMLファイルを処理することは、PHPで高性能XML解析を実装する重要な手段です。イベント駆動型とストリーミングリーディングを組み合わせて、メモリオーバーヘッドを大幅に減らし、解析効率を向上させることができます。デザイン、メモリ制御戦略、コールバック関数のパフォーマンスチューニングスキルをマスターする限り、大きなファイル解析タスクを簡単に処理できます。
XMLのインポートに依存しているシステムを構築している場合は、今日からXML_PARSEを試してください。これはツールボックスで非常に実用的な武器になります。
関連タグ:
xml_parse