큰 파일의 XML 구문 분석, 특히 파일 컨텐츠가 비교적 복잡하거나 많은 외부 엔티티 참조가있을 때 성능 문제는 종종 병목 현상이됩니다. XML_SET_EXTERNAL_ENTITY_REF_HANDLER는 XML의 외부 엔티티 참조에 대한 콜백 함수를 처리하기 위해 PHP가 제공 한 함수입니다. 이 기능은 분석의 정확도에 영향을 줄 수있을뿐만 아니라 분석 성능에 중요한 영향을 미칠 수도 있습니다.
XML 파일에는 외부 파일 또는 데이터 리소스 일 수있는 외부 엔티티 (외부 엔티티)가 포함될 수 있습니다. XML 파서가 이러한 외부 엔티티를 만나면 일반적으로 네트워크 요청 또는 파일 액세스 작업을 수행하여 해당 데이터를로드합니다. XML 파일에 여러 외부 엔티티가있는 경우 구문 분석 중 파일로드 및 네트워크 요청은 전체 구문 분석 프로세스의 속도가 크게 저하 될 수 있습니다.
<span><span><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span></span></span><span> encoding=</span><span><span class="hljs-string">"UTF-8"</span></span><span>?>
</span><span><span class="hljs-meta"><!DOCTYPE <span class="hljs-keyword">note</span></span></span><span> </span><span><span class="hljs-keyword">SYSTEM</span></span><span> </span><span><span class="hljs-string">"note.dtd"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">note</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">to</span></span></span><span>>Tove</span><span><span class="hljs-tag"></<span class="hljs-name">to</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">from</span></span></span><span>>Jani</span><span><span class="hljs-tag"></<span class="hljs-name">from</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">heading</span></span></span><span>>Reminder</span><span><span class="hljs-tag"></<span class="hljs-name">heading</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">body</span></span></span><span>>Don't forget me this weekend!</span><span><span class="hljs-tag"></<span class="hljs-name">body</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">note</span></span></span><span>>
</span></span>
이 예에서 Note.dtd 는 외부 엔티티입니다. XML을 구문 분석 할 때 파서는 DTD 파일을로드해야하므로 성능 문제가 발생할 수 있습니다.
XML_SET_EXTERNAL_ENTITY_REF_HANDLER는 XML 파서가 외부 엔티티를 구문 분석 할 때 처리 할 콜백 함수를 설정하는 PHP의 함수입니다. 이 기능을 통해 개발자는 XML 파일의 외부 엔티티를 처리하는 방법 (예 : 외부 파일을 다운로드 해야하는지 또는 대체 콘텐츠를 직접 반환하는 방법을 지정할 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_external_entity_ref_handler</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$public</span></span></span><span>, </span><span><span class="hljs-variable">$system</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>) {
</span><span><span class="hljs-comment">// 외부 엔티티를 처리하는 코드</span></span><span>
</span><span><span class="hljs-comment">// 사용자 정의 컨텐츠 또는 리소스를 반환합니다</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"<dummy>Custom content</dummy>"</span></span><span>;
}
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_external_entity_ref_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"my_external_entity_ref_handler"</span></span><span>);
</span></span>
이 예에서 XML 파서가 외부 엔티티를 만나면 외부 엔티티에서 참조 한 파일 또는 URL에 액세스하는 대신 my_external_entity_ref_handler 콜백 함수를 호출합니다. 이 접근법은 종종 구문 분석 성능을 향상시키고 불필요한 네트워크 요청 또는 디스크 I/O 작업을 피하는 데 사용됩니다.
XML 파일에 많은 수의 외부 엔티티가 포함 된 경우 기본 동작은 Parser가 이러한 엔티티 파일을 다운로드하려고합니다. 이는 I/O 운영을 증가시킬뿐만 아니라 네트워크 대기 시간의 영향을받을 수도 있습니다. 외부 엔티티 파일에 액세스 할 수없는 경우 구문 분석 프로세스가 실패 할 수 있습니다. XML_SET_EXTERNAL_ENTITY_REF_HANDLER 함수를 사용하면 이러한 불필요한 외부 요청을 피할 수 있으므로 구문 분석 프로세스 속도를 높일 수 있습니다.
많은 양의 XML 데이터를 처리 할 때 외부 엔티티는 특히 네트워크가 불안정하거나 파일이 클 때 구문 분석 프로세스가 매우 느려질 수 있습니다. XML_SET_EXTERNAL_ENTITY_REF_HANDLER를 통해 이러한 외부 엔티티가로드되었는지 또는 정적 대체 컨텐츠를 직접 반환하는지 여부를 제어하여 성능을 크게 향상시킬 수 있습니다.
XML 파서가 외부 엔티티를로드하면 일반적으로 해당 엔티티의 데이터를 메모리에로드해야합니다. 외부 엔티티 파일이 매우 크면 과도한 메모리 소비가 발생하고 시스템의 전반적인 성능에 영향을 줄 수 있습니다. 외부 엔티티를 사용자 정의하면 특히 메모리 소비를 효과적으로 줄일 수있는 큰 파일을 처리 할 때 과도한 메모리 사용을 피할 수 있습니다.
XML 파일의 외부 엔티티가 중요하지 않은 경우 XML_SET_EXTERNAL_ENTITY_ERF_HANDLER를 통해 외부 엔티티 구문 분석을 비활성화 할 수 있으며 XML 자체의 내용 만 처리 할 수 있습니다. 예를 들어, 구문자의 추가 네트워크 요청을 피하기 위해 빈 문자열 또는 사전 정의 된 컨텐츠를 반환 할 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">ignore_external_entity</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$public</span></span></span><span>, </span><span><span class="hljs-variable">$system</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">''</span></span><span>; </span><span><span class="hljs-comment">// 빈 콘텐츠로 직접 돌아갑니다,외부 엔티티 다운로드를 피하십시오</span></span><span>
}
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_external_entity_ref_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"ignore_external_entity"</span></span><span>);
</span></span>
일부 외부 엔티티가 종종 액세스가 필요한 경우, 해결할 때마다 네트워크 요청을 피하기 위해 이러한 외부 엔티티를 먼저 로컬로 캐시하는 것을 고려하십시오. 콜백 함수를 사용하면 매번 다시 다운로드하는 대신 로컬 캐시 된 엔티티를 반환 할 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">cached_external_entity</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$public</span></span></span><span>, </span><span><span class="hljs-variable">$system</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>) {
</span><span><span class="hljs-variable">$cached_data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">"/path/to/cached_entity.xml"</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$cached_data</span></span><span>;
}
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_external_entity_ref_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"cached_external_entity"</span></span><span>);
</span></span>
경우에 따라 데이터베이스 또는 기타 로컬 리소스에서 데이터를 얻는 것과 같은 비즈니스 요구에 따라 사용자 정의 컨텐츠를 외부 엔티티에 반환해야 할 수도 있습니다. XML_SET_EXTERNAL_ENTITY_REF_HANDLER를 통해 실제 조건에 따라 특정 데이터를 반환하여 성능을 추가로 최적화 할 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_external_entity</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$public</span></span></span><span>, </span><span><span class="hljs-variable">$system</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>) {
</span><span><span class="hljs-comment">// 엔티티 데이터가 데이터베이스에서 쿼리되었다고 가정합니다</span></span><span>
</span><span><span class="hljs-variable">$db_data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_entity_from_db</span></span><span>(</span><span><span class="hljs-variable">$public</span></span><span>, </span><span><span class="hljs-variable">$system</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$db_data</span></span><span>;
}
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_external_entity_ref_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"custom_external_entity"</span></span><span>);
</span></span>
XML_SET_EXTERNAL_ENTITY_REF_HANDLER는 XML 구문 분석을 처리 할 때 강력한 도구를 제공하므로 개발자가 외부 엔티티를 처리하는 방법을 사용자 정의 할 수 있습니다. 이 기능을 합리적으로 사용하면 대형 파일에서 XML 구문 분석의 성능을 효과적으로 개선 할 수 있으며 네트워크 요청, 메모리 소비 및 불필요한 외부 종속성을 피할 수 있습니다. 이 접근법은 대규모 XML 데이터를 처리 할 때, 특히 여러 외부 엔티티를 포함하는 파일을 처리 할 때 성능을 크게 향상시킬 수있어 구문 분석 프로세스가 더 효율적이고 안정적 일 수 있습니다.