큰 XML 파일을 처리 할 때는 PHP (국외 파서 기반)가 제공하는 XML_PARSE 기능이 효율적인 방법입니다. 그러나 부적절한 메모리 관리로 인해 수십 개의 또는 수백 메가 바이트의 XML 파일을 처리 할 때 메모리 오버플로, 성능 저하 및 스크립트 충돌이 발생하는 경우가 많습니다. 이 기사는 XML_PARSE 의 메모리 관리를 최적화하는 관점에서 큰 XML 파일 처리의 효율성과 안정성을 향상시키는 방법을 소개합니다.
XML은 공통 데이터 교환 형식입니다. 전자 상거래, 물류, 컨텐츠 집계 등과 같은 많은 시스템은 XML에 의존하여 데이터를 가져 오거나 내보내십시오. 그러나 PHP가 큰 XML 파일을 구문 분석 할 때 전체 파일을 한 번에 메모리로 읽으면 메모리 리소스가 빠르게 소진됩니다.
예를 들어:
$xml = file_get_contents('https://m66.net/data/huge.xml');
$parser = xml_parser_create();
xml_parse($parser, $xml, true);
xml_parser_free($parser);
위의 코드는 큰 파일을 처리 할 때 특히 Memory_Limit이 php.ini 로 설정된 서버 환경에서 쉽게 메모리 오버 플로우를 유발할 수 있습니다.
전체 XML 파일을 한 번에 읽는 것과 비교하여 XML_PARSE () 와 결합 된 fopen () 및 fread () 의 증분 구문 분석 방법을 사용하는 것이 좋습니다. 이것은 메모리 사용량을 크게 줄일 수 있습니다.
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
$fp = fopen("https://m66.net/data/huge.xml", "r");
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
}
fclose($fp);
xml_parser_free($parser);
콜백 함수에서 데이터 저장을 해결하려면 메모리 관리가 필요합니다. 전체 XML 트리 구조를 메모리에 저장하지 마십시오. 대신 유용한 정보를 추출한 후 즉시 데이터베이스를 처리하거나 작성하도록 선택해야합니다.
function startElement($parser, $name, $attrs) {
if ($name === 'ITEM') {
// 키워드 필드 만 추출하십시오
global $currentItem;
$currentItem = [];
}
}
function endElement($parser, $name) {
global $currentItem;
if ($name === 'ITEM') {
// 처리 후 즉시 정리하십시오
processItem($currentItem);
unset($currentItem);
}
}
function processItem($item) {
// 예:데이터베이스에 쓰거나 즉시 출력하십시오
file_put_contents('/tmp/items.txt', json_encode($item) . PHP_EOL, FILE_APPEND);
}
스크립트 메모리 제한과 실행 시간은 프로세스의 중단을 피하기 위해 코드를 통해 동적으로 증가 할 수 있습니다.
ini_set('memory_limit', '512M');
set_time_limit(0);
그러나 이것은 문제에 대한 기본 해결책이 아니라 파일이 약간 더 크지 만 구조가 합리적 인 상황에만 적용됩니다.
Sax Parsing Mode 사용 : XML 파서 자체는 이벤트 중심이므로이를 활용하면 전체 DOM 트리를 구축하고 메모리를 저장하는 것을 피할 수 있습니다.
샤드 처리 + 브레이크 포인트 연속 판독 값 : 특정 대형 XML 파일 (예 : 각 항목은 독립 데이터 항목)의 경우 상태를 조각으로 저장하고 중단 점 연속 판독 값을 저장할 수 있습니다.
생성기와 결합하여 데이터를 처리합니다 . PHP 생성기 ( 수율 )는 XML 콜백 기능과 함께 사용하여 저 메모리 데이터 스트리밍 처리를 구현할 수 있습니다.
큰 XML 파일을 처리하는 핵심은 "전체 파일 읽기"및 "전체 데이터 저장"을 피하는 것입니다. 스트리밍 읽기, 인스턴트 데이터 처리 및 메모리 피크 컨트롤과 결합 된 XML_PARSE를 통해 효율적이고 안정적이며 제어 가능한 XML 구문 분석 솔루션을 달성 할 수 있습니다.
이는 단일 구문 분석뿐만 아니라 정기적 인 수입이 필요한 백그라운드 작업 시나리오에도 적합합니다. 이 기사의 최적화 아이디어가 큰 XML 파일을 쉽게 처리하는 데 도움이되기를 바랍니다.
관련 태그:
xml_parse