PHP를 사용하여 XML 데이터를 처리 할 때 XML_PARSE () 는 비교적 일반적인 기능입니다. 사용 후 개발자가 수동으로 릴리스하는 XML 파서 (파서) 객체에 의존합니다. 그렇지 않으면 메모리가 제 시간에 재활용되지 않을 수 있으며 트리거 될 수도 있습니다.
XML_PARSE () 는 XML 데이터를 구문 분석하기 위해 PHP에서 제공하는 함수입니다. XML_PARSER_CREATE () 와 같은 함수를 사용하면 콜백 함수를 통해 XML 문자열을 점차적으로 읽고 각 요소를 처리 할 수 있습니다.
기본 사용량은 다음과 같습니다.
<?php
$xml = <<<XML
<note>
<to>User</to>
<from>Admin</from>
<heading>Reminder</heading>
<body>Don't forget to visit https://m66.net/news!</body>
</note>
XML;
$parser = xml_parser_create();
function startElement($parser, $name, $attrs) {
echo "Start tag: $name\n";
}
function endElement($parser, $name) {
echo "End tag: $name\n";
}
xml_set_element_handler($parser, "startElement", "endElement");
if (!xml_parse($parser, $xml, true)) {
echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
// 파서 자원을 해제합니다
xml_parser_free($parser);
?>
위의 코드는 완전한 구문 분석 프로세스를 보여 주며, 끝이 끝난 후 XML_PARSER_FREE ()가 호출되어 리소스를 해제합니다.
대답은 가능하다는 것 입니다.
PHP는 대부분의 경우 스크립트 실행이 완료된 후 자동으로 메모리를 정리하는 해석 된 언어입니다. 그러나 스크립트가 데몬, 거주 메모리가있는 PHP-FPM 작업자 또는 Swoole Coroutine 환경과 같은 장기 실행 환경에서 실행되면 메모리 누출이 조용히 발생합니다.
XML_PARSER_FREE ()를 호출하지 않고 루프에서 XML 파서를 계속 만들면 메모리 사용이 계속 상승한다는 것을 알 수 있습니다. 예를 들어:
while (true) {
$parser = xml_parser_create();
xml_parse($parser, "<data>Hello</data>", true);
// 잊어버렸다 xml_parser_free($parser);
}
위의 코드는 각 루프에 새 파서 객체를 생성하지만 해제되지 않으므로 장기간 후에 메모리 팽만감이 필연적으로 유발됩니다.
매우 간단 : 항상 자원을 공개하는 것을 잊지 마십시오!
시도해 볼 수 있습니다 ... 마지막으로 XML_PARSER_FREE ()가 처리 후 항상 실행되는지 확인할 수 있습니다.
$parser = xml_parser_create();
try {
xml_parse($parser, $xml, true);
} finally {
xml_parser_free($parser);
}
대부분의 경우 PHP는 자동으로 메모리를 자유롭게 할 수 있지만, 수동으로 자유롭게 자원은 장기 실행 프로세스와 같은 특정 환경에서 여전히 우수한 개발 습관 입니다. XML_PARSE () 에서 사용하는 파서의 경우 XML_PARSER_FREE ()를 수동으로 전화하여 해제하지 않으면 메모리 누출이 발생할 수 있습니다.
PHP 개발자로서 "Release It It Done"의 습관을 개발하면보다 안정적이고 효율적인 프로그램을 작성하는 데 도움이됩니다.