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>
$パーサーは、 XML_PARSER_CREATEによって作成されたパーサーリソースです。
$ハンドラーは、パーサーが処理命令に遭遇したときに呼び出されるユーザー定義のコールバック関数です。
たとえば、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ファイルに多数の処理命令があり、処理命令の内容が比較的複雑な場合、特にドキュメント構造が複雑である場合、または一部の解析挙動が標準化されていない場合、いくつかのシナリオでコールバック関数が複数回トリガーされる場合もあります。
不適切なパーサー状態管理<br> 解析状態が適切に処理されていない場合、またはリソースがクリーニングされている場合、同じ命令のコールバックが複数回起動される可能性があります。たとえば、パーサー状態が一貫性のないままである場合、同じ処理命令に複数回遭遇する可能性があります。
コールバック関数が複数回呼び出されないようにするために、次の測定値をとることができます。
XML_SET_PROCESSING_INSTRUCTION_HANDLERを呼び出すとき、関数が一度だけ呼び出されていることを確認し、同じコールバックの設定を複数回避けてください。変更を行う必要がある場合は、最初に既存のコールバックを削除して、設定が繰り返されないことを確認できます。
<span><span><span class="hljs-comment">// コールバック関数を1回だけ設定します</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ファイルを解析する場合、不必要なコールバックトリガーを回避できます。