PHP에서 XML을 구문 분석하는 일반적인 방법 중 하나는 XML_PARSER_CREATE () 및 XML_PARSE () 와 같은 관련 기능을 사용하여 XML 데이터 행을 라인별로 처리하는 것입니다. 그러나 특히 큰 파일 또는 여러 개의 입력 라인을 처리 할 때 리소스 릴리스 또는 부적절한 처리 방법에주의를 기울이지 않으면 메모리 누출을 유발할 수 있으므로 스크립트의 메모리 사용량이 증가하여 결국 서버 예외를 유발하거나 충돌 할 수 있습니다.
이 기사는 문제의 원인을 간단히 소개하고 메모리 누출을 피할 수있는 안전하고 권장되는 방법을 제공합니다.
다음 코드 스 니펫을 고려하십시오.
$parser = xml_parser_create();
$fp = fopen("https://m66.net/data.xml", "r");
while ($data = fgets($fp)) {
xml_parse($parser, $data, feof($fp));
}
fclose($fp);
// Parser Resources를 릴리스하는 것을 잊었습니다
이 코드에서 XML_PARSE ()는 각 데이터 라인을 읽을 때 자원을 지속적으로 할당합니다. 파서를 풀기 위해 XML_PARSER_FREE ($ PARSER) 에 전화하는 것을 잊어 버린 경우, 특히 크거나 고주파 XML 요청을 처리 할 때 프로그램이 차지하는 메모리가 해제되지 않습니다. 문제는 더욱 심각합니다.
메모리 누출을 피하기 위해 가장 직접적이고 필요한 단계는 더 이상 파서가 필요하지 않은 시간에 xml_parser_free ()를 호출하는 것입니다.
$parser = xml_parser_create();
// 선택 과목:처리 기능 설정
xml_set_element_handler($parser, "startElement", "endElement");
$fp = fopen("https://m66.net/data.xml", "r");
while ($data = fgets($fp)) {
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);
파서의 콜백 처리 기능은 노드 처리가 완료된 직후 데이터가 처리되고 더 이상 사용되지 않는 변수가 해제되도록 설정할 수 있습니다.
function startElement($parser, $name, $attrs) {
// 처리 시작 태그
}
function endElement($parser, $name) {
// 처리 엔드 태그
}
xml_set_element_handler($parser, "startElement", "endElement");
fgets ()를 사용하지 않으면 Fread ()를 사용하여 긴 줄이 한 번에 너무 많은 메모리를 차지하지 못하도록 매번 읽는 데이터 양을 제한 할 수 있습니다.
while ($data = fread($fp, 4096)) {
xml_parse($parser, $data, feof($fp));
}
XMLREADER는 보다 현대적인 풀-스키마 기반 XML 구문 분석 방법입니다. 성능이 높을뿐만 아니라 더 세련된 메모리 관리를 가지고 있으며, 이는 대량 데이터 볼륨을 사용한 XML 스트림 처리에 적합합니다.
$reader = new XMLReader();
$reader->open("https://m66.net/data.xml");
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item') {
// 거래하십시오 <item> 마디
}
}
$reader->close();
XML_PARSE를 사용하여 멀티 라인 XML 데이터를 처리 할 때 메모리 누출을 피하기 위해 파서 리소스를 제 시간에 해제해야합니다. 더 권장되는 접근법은 XMLReader 와 같은보다 현대적인 구문 분석 방법을 사용하는 것입니다.이 방법은 성능 및 메모리 제어 측면에서 더 좋습니다. 어떤 방법을 사용하든, 자원 관리에 대한 좋은 감각은 항상 코드의 견고성을 보장하는 열쇠입니다.
이 기사가 PHP의 XML 메모리 문제를 다루는 데 도움이되기를 바랍니다!