Lors du traitement des fichiers XML à grande échelle dans PHP, les méthodes d'analyse conventionnelles (telles que simplexml_load_file () ou DomDocument ) peuvent facilement entraîner des problèmes tels que l'utilisation excessive de la mémoire et les goulots d'étranglement de performances. En revanche, l'utilisation de XML_PARSE (analyseur basé sur l'événement basé sur les expatriés) peut traiter plus efficacement les données XML importantes. Cet article explorera en profondeur comment utiliser XML_Parse pour traiter efficacement les fichiers XML à grande échelle et partager certaines techniques d'optimisation et les meilleures pratiques.
XML_PARSE est une méthode d'analyse XML basée sur des événements et appartient à "l'analyseur en streaming". Cela signifie qu'au lieu de charger l'ensemble du fichier XML en mémoire à la fois, il lit la ligne par ligne et déclenche une fonction de rappel spécifique pour répondre aux balises, propriétés, etc. dans le XML, ce qui est idéal pour:
analyses des centaines de MB ou même GB de fichiers XML;
Systèmes exécutés dans des environnements à basse mémoire;
Scénarios qui nécessitent un traitement des données lors de l'analyse (comme l'importation de bases de données, le traitement en temps réel).
Voici un exemple de processus de base en utilisant XML_PARSER_CREATE et XML_PARSE :
<?php
$parser = xml_parser_create();
// Définir la fonction de rappel
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
// Ouvrir un grand fichier
$fp = fopen("https://m66.net/data/largefile.xml", "r");
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
die(sprintf(
"XML erreur: %s Dans le %d D'ACCORD",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)
));
}
}
xml_parser_free($parser);
fclose($fp);
// Exemple de fonction de rappel
function startElement($parser, $name, $attrs) {
// Peut traiter la logique en fonction du nom de l'étiquette
if ($name == "ITEM") {
echo "Commencer à en traiter un ITEM\n";
}
}
function endElement($parser, $name) {
if ($name == "ITEM") {
echo "Traitement final d'un ITEM\n";
}
}
function characterData($parser, $data) {
// Traiter le contenu texte dans la balise
$trimmed = trim($data);
if (!empty($trimmed)) {
echo "données: $trimmed\n";
}
}
?>
Évitez de lire les grands fichiers à la fois <br> Utilisez fread () pour faire boucle pour lire le contenu des fichiers en morceaux pour éviter les explosions de mémoire.
Utilisez des fonctions de rappel raisonnablement <br> Évitez d'effectuer trop d'opérations logiques dans la fonction de rappel, en particulier les E / S de disque ou les demandes de réseau.
Variables globales proprement propres <br> Lorsque vous utilisez l'état temporaire de la variable globale dans la fonction de rappel, en temps opportun unset () peut empêcher la fuite de mémoire.
Activer la logique de traitement du flux <br> Lors de la combinaison des opérations de base de données, chaque entité analysée est immédiatement écrite dans la base de données, plutôt que de collecter toutes les entités, puis de les regrouper.
Éteignez les fonctionnalités inutiles <br> S'il n'y a pas d'exigence d'espace de noms, une résolution supplémentaire de l'espace de noms peut être évitée pour améliorer les performances.
Problèmes de codage : assurez-vous que le codage du fichier XML est cohérent avec le fichier PHP ou forcez le paramètre à l'aide de XML_PARSER_SET_OPTION ($ Parser, XML_OPTION_TARGET_ENCODING, "UTF-8") .
Problème d'entité : Si une référence d'entité est utilisée dans XML (telle que & nbsp; ), elle peut provoquer des exceptions d'analyse et doit être traitée à l'avance ou le remplacement de l'entité est activé.
Gestion des erreurs : Capture en temps opportun et imprimer les informations d'erreur fournies par xml_error_string () et xml_get_current_line_number () pour un débogage facile.
L'utilisation de XML_Parse pour traiter les fichiers XML à grande échelle est un moyen important d'implémenter l'analyse XML haute performance en PHP. Grâce à des événements combinés à la lecture en streaming, nous pouvons réduire considérablement les frais généraux de mémoire et améliorer l'efficacité de l'analyse. Tant que vous maîtrisez la conception, la stratégie de contrôle de la mémoire et les compétences de réglage des performances des fonctions de rappel, vous pouvez facilement gérer les tâches d'analyse de fichiers importantes.
Si vous construisez un système qui repose sur les importations XML, essayez XML_PARSE à partir d'aujourd'hui, qui sera une arme très pratique dans votre boîte à outils.
Étiquettes associées:
xml_parse