Position actuelle: Accueil> Derniers articles> FAQ: Comment éviter la fonction de rappel de XML_SET_PROCESSING_INSTRUCTION_HANDLER appelé plusieurs fois pour améliorer les performances d'analyse?

FAQ: Comment éviter la fonction de rappel de XML_SET_PROCESSING_INSTRUCTION_HANDLER appelé plusieurs fois pour améliorer les performances d'analyse?

gitbox 2025-06-24

1. Introduction à la fonction XML_SET_PROCESSING_INSTRUCTION_HANDLER

XML_SET_PROCESSING_INSTRUCTION_HANDLER est une fonction de PHP qui définit les fonctions de rappel pour le traitement des instructions. Lors de l'analyse d'un PI dans un document XML, la fonction de rappel set est déclenchée. Sa syntaxe est la suivante:

 <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 est une ressource d'analyse créée par XML_PARSER_CREATE .

  • $ Handler est une fonction de rappel définie par l'utilisateur qui est appelée lorsque l'analyseur rencontre une instruction de traitement.

Par exemple, supposons que le fichier XML contient les instructions de traitement suivantes:

 <span><span><span class="hljs-meta">&lt;?php my_processing_instruction data ?&gt;</span></span><span>
</span></span>

Nous pouvons gérer cette situation en définissant un rappel qui gère l'instruction:

 <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">"Instructions de traitement: <span class="hljs-subst">{$target}</span></span></span><span> =&gt; </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>

Dans cet exemple, quand l'analyse <? My_processing_instruction Data?> , Handle_pi sera appelé et les informations pertinentes seront imprimées.


2. Pourquoi la fonction de rappel est-elle appelée plusieurs fois?

Il y a généralement plusieurs raisons pour lesquelles les fonctions de rappel sont appelées plusieurs fois:

  1. Définir plusieurs fois le rappel des commandes <br> Si xml_set_processing_instruction_handler est appelé plusieurs fois sur le même analyseur pour définir la fonction de rappel, cela peut entraîner le déclenchement de la fonction de rappel plusieurs fois. Chaque appel écrasera la fonction de rappel précédemment définie, qui peut être définie plusieurs fois intentionnellement ou par inadvertance.

  2. Déblération répétée de l'analyseur <br> S'il y a un grand nombre d'instructions de traitement dans le fichier XML et que le contenu des instructions de traitement est relativement complexe, il peut également entraîner la déclenchement de la fonction de rappel dans certains scénarios, en particulier lorsque la structure du document est complexe ou qu'un comportement d'analyse n'est pas standardisé.

  3. Management de l'État d'analyseur inapproprié <br> Si l'état d'analyse n'est pas correctement traité ou si la ressource est nettoyée, elle peut entraîner le licenciement de la même instruction de la même instruction. Par exemple, lorsque l'état d'analyseur reste incohérent, la même instruction de traitement peut être rencontrée plusieurs fois.


3. Comment éviter que les fonctions de rappel soient appelées plusieurs fois?

Pour éviter que les fonctions de rappel soient appelées plusieurs fois, les mesures suivantes peuvent être prises:

3.1 Assurez-vous de définir le rappel une seule fois

Lorsque vous appelez XML_SET_PROCESSING_INSTRUCTION_HANDLER , assurez-vous que la fonction est appelée une seule fois et évitez de définir le même rappel plusieurs fois. Si vous devez apporter des modifications, vous pouvez d'abord supprimer le rappel existant pour vous assurer que les paramètres ne sont pas répétés.

 <span><span><span class="hljs-comment">// Définissez la fonction de rappel une seule fois</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>
3.2 Utilisez XML_SET_CHARACTER_DATA_HANDLER

Si vous n'avez besoin que de traiter une partie du contenu du PI et que vous n'avez pas besoin de déclencher un rappel complet à chaque fois, vous pouvez envisager de traiter le contenu lié au PI via XML_SET_CHARACTER_DATA_HANDLER , ce qui peut réduire les appels de rappel inutiles et améliorer les performances.

 <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">// Processus uniquement PI Données de caractère dans</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Données de caractère: <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>
3.3 Vérifiez et effacez les ressources de l'analyseur

Assurez-vous qu'après chaque analyse terminée, la ressource de l'analyseur est effacée à temps pour éviter l'état de l'analyseur affectant l'exécution de rappel ultérieure.

 <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>

En libérant les ressources de l'analyseur, vous pouvez vous assurer que l'état de l'analyseur n'affectera pas les opérations d'analyse ultérieure.

3.4 Optimisation structurelle

Optimiser la structure des fichiers XML, réduire le PI inutile et minimiser le nombre de rappels déclenchés à chaque fois que vous analysez. S'il y a une grande quantité de PIS redondants dans le fichier, envisagez de les ajuster lors de la génération du fichier XML pour éviter trop d'instructions de traitement non valides.


4. Résumé d'optimisation des performances

Afin d'éviter la fonction de rappel de XML_SET_PROCESSING_INSTRUCTION_HANDLER étant appelée plusieurs fois, le développeur devrait:

  1. Assurez-vous que le paramètre de fonction de rappel ne se produit qu'une seule fois.

  2. Si possible, utilisez d'autres méthodes de traitement telles que XML_SET_CHARACTER_DATA_HANDLER .

  3. Gérez et effacez correctement les ressources d'analyser pour éviter la confusion de l'État.

  4. Essayez d'optimiser la structure du fichier XML et réduisez les instructions de traitement inutiles.

Grâce à ces mesures, les performances de l'analyse XML peuvent être effectivement améliorées et des déclencheurs de rappel inutiles peuvent être évités, en particulier lors de l'analyse des fichiers XML à grande échelle.