L'une des façons courantes d'analyser XML dans PHP est d'utiliser XML_PARSER_CREATE () et des fonctions connexes, telles que XML_Parse () pour traiter la ligne de données XML par ligne. Cependant, si vous ne faites pas attention à la libération de ressources ou à la méthode de traitement inappropriée, en particulier lorsque vous gérez des fichiers volumineux ou plusieurs lignes d'entrée, il est facile de provoquer une fuite de mémoire, ce qui entraîne une utilisation croissante de la mémoire des scripts, ce qui peut éventuellement provoquer des exceptions de serveurs ou même des accidents.
Cet article présentera brièvement les causes du problème et fournira des moyens sûrs et recommandés d'éviter les fuites de mémoire.
Considérez l'extrait de code suivant:
$parser = xml_parser_create();
$fp = fopen("https://m66.net/data.xml", "r");
while ($data = fgets($fp)) {
xml_parse($parser, $data, feof($fp));
}
fclose($fp);
// Oublié de libérer des ressources d'analyse
Dans ce code, XML_Parse () allouera en continu les ressources à mesure que chaque ligne de données est lue. Si vous oubliez d'appeler XML_PARSER_FREE ($ analyseur) pour libérer l'analyseur, la mémoire occupée par le programme ne sera pas publiée, surtout lors de la gestion des demandes de XML de grande ou haute fréquence, le problème est encore plus grave.
Pour éviter les fuites de mémoire, l'étape la plus directe et nécessaire est d'appeler XML_PARSER_FREE () dans le temps où il n'a plus besoin d'un analyseur:
$parser = xml_parser_create();
// Facultatif:Configuration des fonctions de traitement
xml_set_element_handler($parser, "startElement", "endElement");
$fp = fopen("https://m66.net/data.xml", "r");
while ($data = fgets($fp)) {
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)));
}
}
fclose($fp);
// Libérez correctement les ressources d'analyse
xml_parser_free($parser);
La fonction de traitement de rappel de l'analyseur peut être définie afin que les données soient traitées immédiatement après la fin du traitement du nœud et que les variables qui ne soient plus utilisées soient libérées.
function startElement($parser, $name, $attrs) {
// Tag de démarrage de traitement
}
function endElement($parser, $name) {
// Tag de fin de traitement
}
xml_set_element_handler($parser, "startElement", "endElement");
Si vous n'utilisez pas FGETS () , vous pouvez utiliser Fread () pour limiter la quantité de données lue à chaque fois pour empêcher les longues lignes d'occuper trop de mémoire en même temps.
while ($data = fread($fp, 4096)) {
xml_parse($parser, $data, feof($fp));
}
XMLReader est une méthode d'analyse XML plus moderne et basée sur Pull-Schema. Il a non seulement des performances plus élevées, mais a également une gestion plus raffinée de la mémoire, ce qui convient au traitement des flux XML avec de grands volumes de données:
$reader = new XMLReader();
$reader->open("https://m66.net/data.xml");
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item') {
// traiter avec <item> nœud
}
}
$reader->close();
Lorsque vous utilisez XML_Parse pour traiter les données XML multi-lignes, n'oubliez pas de libérer des ressources d'analyse à temps pour éviter les fuites de mémoire. L'approche la plus recommandée consiste à utiliser des méthodes d'analyse plus modernes telles que XMLReader , qui sont meilleures en termes de performances et de contrôle de la mémoire. Peu importe la méthode utilisée, un bon sens de la gestion des ressources est toujours la clé pour assurer la robustesse du code.
J'espère que cet article vous sera utile pour traiter les problèmes de mémoire XML dans PHP!