현재 위치: > 최신 기사 목록> XML_PARSE의 메모리 관리를 최적화하여 대형 XML 파일을 처리하는 효율성과 안정성을 향상시키는 방법은 무엇입니까?

XML_PARSE의 메모리 관리를 최적화하여 대형 XML 파일을 처리하는 효율성과 안정성을 향상시키는 방법은 무엇입니까?

M66 2025-04-25

큰 XML 파일을 처리 할 때는 PHP (국외 파서 기반)가 제공하는 XML_PARSE 기능이 효율적인 방법입니다. 그러나 부적절한 메모리 관리로 인해 수십 개의 또는 수백 메가 바이트의 XML 파일을 처리 할 때 메모리 오버플로, 성능 저하 및 스크립트 충돌이 발생하는 경우가 많습니다. 이 기사는 XML_PARSE 의 메모리 관리를 최적화하는 관점에서 큰 XML 파일 처리의 효율성과 안정성을 향상시키는 방법을 소개합니다.

1. 문제 배경

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 로 설정된 서버 환경에서 쉽게 메모리 오버 플로우를 유발할 수 있습니다.

2. 최적화 전략

1. 전체 읽기 대신 스트리밍 읽기를 사용하십시오

전체 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);

2. 콜백에서 데이터를 스태킹하지 마십시오

콜백 함수에서 데이터 저장을 해결하려면 메모리 관리가 필요합니다. 전체 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);
}

3. 합리적인 메모리 제한 및 시간 초과를 설정하십시오

스크립트 메모리 제한과 실행 시간은 프로세스의 중단을 피하기 위해 코드를 통해 동적으로 증가 할 수 있습니다.

 ini_set('memory_limit', '512M');
set_time_limit(0);

그러나 이것은 문제에 대한 기본 해결책이 아니라 파일이 약간 더 크지 만 구조가 합리적 인 상황에만 적용됩니다.

3. 추가 최적화 제안

  • Sax Parsing Mode 사용 : XML 파서 자체는 이벤트 중심이므로이를 활용하면 전체 DOM 트리를 구축하고 메모리를 저장하는 것을 피할 수 있습니다.

  • 샤드 처리 + 브레이크 포인트 연속 판독 값 : 특정 대형 XML 파일 (예 : 각 항목은 독립 데이터 항목)의 경우 상태를 조각으로 저장하고 중단 점 연속 판독 값을 저장할 수 있습니다.

  • 생성기와 결합하여 데이터를 처리합니다 . PHP 생성기 ( 수율 )는 XML 콜백 기능과 함께 사용하여 저 메모리 데이터 스트리밍 처리를 구현할 수 있습니다.

4. 요약

큰 XML 파일을 처리하는 핵심은 "전체 파일 읽기"및 "전체 데이터 저장"을 피하는 것입니다. 스트리밍 읽기, 인스턴트 데이터 처리 및 메모리 피크 컨트롤과 결합 된 XML_PARSE를 통해 효율적이고 안정적이며 제어 가능한 XML 구문 분석 솔루션을 달성 할 수 있습니다.

이는 단일 구문 분석뿐만 아니라 정기적 인 수입이 필요한 백그라운드 작업 시나리오에도 적합합니다. 이 기사의 최적화 아이디어가 큰 XML 파일을 쉽게 처리하는 데 도움이되기를 바랍니다.