XML_SET_PROCESSING_INSTRUCTION_HANDLER 는 PHP의 함수로 처리 지침을 위해 콜백 함수를 설정합니다. XML 문서에서 PI를 구문 분석 할 때 설정 콜백 함수가 트리거됩니다. 구문은 다음과 같습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">xml_set_processing_instruction_handler</span></span><span> (resource </span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$handler</span></span><span>)
</span></span>
$ Parser는 XML_PARSER_CREATE 에서 만든 파서 리소스입니다.
$ handler는 Parser가 처리 명령어를 만나면 호출되는 사용자 정의 콜백 기능입니다.
예를 들어 XML 파일에 다음 처리 지침이 포함되어 있다고 가정합니다.
<span><span><span class="hljs-meta"><?php my_processing_instruction data ?></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">handle_pi</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$target</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"처리 지침: <span class="hljs-subst">{$target}</span></span></span><span> => </span><span><span class="hljs-subst">{$data}</span></span><span>\n";
}
</span><span><span class="hljs-variable">$xml_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_processing_instruction_handler</span></span><span>(</span><span><span class="hljs-variable">$xml_parser</span></span><span>, </span><span><span class="hljs-string">'handle_pi'</span></span><span>);
</span></span>
이 예에서 구문 분석시 <? my_processing_instruction data?> , handle_pi 가 호출되고 관련 정보가 인쇄됩니다.
콜백 함수를 여러 번 호출하는 데는 몇 가지 이유가 있습니다.
처리 명령 콜백을 여러 번 설정하십시오 <br> XML_SET_PROCESSING_INSTRUCTION_HANDLER가 콜백 함수를 설정하기 위해 동일한 구문 프로그램에서 여러 번 호출되면 콜백 기능이 여러 번 트리거 될 수 있습니다. 각 통화는 이전에 설정된 콜백 함수를 덮어 씁니다.이 콜백 함수는 의도적으로 또는 부주의하게 여러 번 설정 될 수 있습니다.
파서의 반복 트리거 <br> XML 파일에 많은 처리 지침이 있고 처리 지침의 내용이 비교적 복잡한 경우, 특히 문서 구조가 복잡하거나 일부 구문 분석 동작이 표준화되지 않은 경우 일부 시나리오에서 콜백 기능이 여러 번 트리거 될 수 있습니다.
부적절한 Parser State Management <br> 구문 분석 상태가 제대로 처리되지 않았거나 자원이 청소되면 동일한 명령의 콜백이 여러 번 해고 될 수 있습니다. 예를 들어, 파서 상태가 일치하지 않으면 동일한 처리 명령이 여러 번 발생할 수 있습니다.
콜백 기능이 여러 번 호출되는 것을 피하기 위해 다음과 같은 조치를 취할 수 있습니다.
XML_SET_PROCESSING_INSTRUCTION_HANDLER를 호출 할 때는 함수가 한 번만 호출되어 있는지 확인하고 동일한 콜백을 여러 번 설정하지 마십시오. 변경 해야하는 경우 먼저 기존 콜백을 제거하여 설정이 반복되지 않도록 할 수 있습니다.
<span><span><span class="hljs-comment">// 콜백 함수를 한 번만 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$xml_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_processing_instruction_handler</span></span><span>(</span><span><span class="hljs-variable">$xml_parser</span></span><span>, </span><span><span class="hljs-string">'handle_pi'</span></span><span>);
</span></span>
PI의 일부 컨텐츠 만 처리해야하고 매번 완전한 콜백을 트리거 할 필요가없는 경우 XML_SET_CHARACTER_DATA_HANDLER를 통해 PI 관련 컨텐츠를 처리하는 것을 고려하여 불필요한 콜백 호출을 줄이고 성능을 향상시킬 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">handle_character_data</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) {
</span><span><span class="hljs-comment">// 프로세스 만 PI 문자 데이터</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"문자 데이터: <span class="hljs-subst">{$data}</span></span></span><span>\n";
}
</span><span><span class="hljs-variable">$xml_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_character_data_handler</span></span><span>(</span><span><span class="hljs-variable">$xml_parser</span></span><span>, </span><span><span class="hljs-string">'handle_character_data'</span></span><span>);
</span></span>
각 구문 분석이 완료된 후에는 구문 분석기의 자원이 시간이 지남에 따라 구문 분석기의 상태를 피하기 위해 후속 콜백 실행에 영향을 미칩니다.
<span><span><span class="hljs-title function_ invoke__">xml_parser_free</span></span><span>(</span><span><span class="hljs-variable">$xml_parser</span></span><span>);
</span></span>
파서 자원을 공개하면 파서의 상태가 후속 구문 분석 작업에 영향을 미치지 않도록 할 수 있습니다.
XML 파일의 구조를 최적화하고, 불필요한 PI를 줄이고, 구문 분석 할 때마다 트리거 된 콜백 수를 최소화하십시오. 파일에 많은 양의 중복 PI가있는 경우 너무 많은 유효하지 않은 처리 지침을 피하기 위해 XML 파일을 생성 할 때 조정하는 것을 고려하십시오.
XML_SET_PROCESSING_INSTRUCTION_HANDLER 의 콜백 함수를 여러 번 호출하지 않으려면 개발자가 다음을 수행해야합니다.
콜백 함수 설정이 한 번만 발생하는지 확인하십시오.
가능하면 XML_SET_CHARACTER_DATA_HANDLER 와 같은 다른 처리 방법을 사용하십시오.
국가 혼란을 피하기 위해 파서 자원을 올바르게 관리하고 지우십시오.
XML 파일 구조를 최적화하고 불필요한 처리 지침을 줄이십시오.
이러한 측정을 통해 특히 대규모 XML 파일을 구문 분석 할 때 XML 구문 분석의 성능이 효과적으로 개선 될 수 있으며 불필요한 콜백 트리거를 피할 수 있습니다.