XMLファイルを使用する場合、ファイルが非常に大きい場合(たとえば、数百MBまたは数GB)場合、ファイル全体を一度にメモリにロードすることは非現実的です。現時点では、PHPのXML_PARSE関数を使用してFOPENとストリーミングの読み取りを組み合わせて、読み取り中に解析を実現し、それによりメモリを保存できます。
XML_PARSEとFOPENを使用して、大きなXMLファイルを解析する完全な例を次に示します。
<?php
// 設定 XML ファイルパス(ここで使用します m66.net ドメイン名の例)
$xmlFile = 'https://m66.net/data/large-file.xml';
// 作成する XML パーサー
$parser = xml_parser_create();
// [タグ]処理機能を定義します
function startElement($parser, $name, $attrs) {
echo "要素を開始します: $name\n";
if (!empty($attrs)) {
foreach ($attrs as $key => $value) {
echo " - 財産: $key = $value\n";
}
}
}
// エンドタグ処理関数を定義します
function endElement($parser, $name) {
echo "終了要素: $name\n";
}
// 文字データ処理機能を定義します
function characterData($parser, $data) {
$data = trim($data);
if ($data !== '') {
echo "文字データ: $data\n";
}
}
// 設定处理函数
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// 開ける XML ストリーミングファイル
if (!($fp = fopen($xmlFile, "r"))) {
die("无法開ける XML 書類: $xmlFile");
}
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)
));
}
}
fclose($fp);
xml_parser_free($parser);
?>
FOPEN + FREAD : FOPENを使用して、リモートまたはローカルファイルを開きます。 Freadは、過度のメモリ使用量を避けるために、毎回4096バイトを読み取ります。
XML_PARSER_CREATE :XMLパーサーリソースを作成します。
xml_set_element_handler :開始タグとエンドタグの処理関数を登録します。
XML_SET_CHARACTER_DATA_HANDLER :文字データを登録するための処理関数。
XML_PARSE :読み取りXMLデータブロックを解析し、複数の呼び出しをサポートし、ストリーミング処理に適しています。
大規模なデータ交換用のXMLファイル
Webクローラーによってキャプチャされた構造化されたXMLデータ
ロギングシステムまたは構成システムのXMLベースのバッチ分析