PHP에서 대규모 XML 파일을 처리 할 때 기존의 구문 분석 방법 (예 : Simplexml_load_file () 또는 domdocument )는 과도한 메모리 사용 및 성능 병목 현상과 같은 문제로 쉽게 이어질 수 있습니다. 대조적으로, XML_PARSE (국외 이벤트 중심 파서)를 사용하면 대형 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> 콜백 함수에서 글로벌 변수 임시 상태를 사용하는 경우 Simely 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를 시작하여 도구 상자에서 매우 실용적인 무기가 될 것입니다.