Probleme avec un parser XML vers PHP

[Résolu]
Signaler
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008
-
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008
-
Salut
j'utilise ce script pour afficher un flux XML en php :

Code :

function GetXMLTree ($xmldata)
{
ini_set ('track_errors', '0');

$xmlreaderror = false;

$parser = xml_parser_create ('ISO-8859-1');
xml_parser_set_option ($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option ($parser, XML_OPTION_CASE_FOLDING, 0);
if (!xml_parse_into_struct ($parser, $xmldata, $vals, $index)) {
$xmlreaderror = true;
echo "error";
}
xml_parser_free ($parser);

if (!$xmlreaderror) {
$result = array ();
$i = 0;
if (isset ($vals [$i]['attributes']))
foreach (array_keys ($vals [$i]['attributes']) as $attkey)
$attributes [$attkey] = $vals [$i]['attributes'][$attkey];

$result [$vals [$i]['tag']] = array_merge ($attributes, GetChildren ($vals, $i, 'open'));
}

ini_set ('track_errors', '0');
return $result;
}

function GetChildren ($vals, &$i, $type)
{
if ($type == 'complete') {
if (isset ($vals [$i]['value']))
return ($vals [$i]['value']);
else
return '';
}

$children = array ();


while ($vals [++$i]['type'] != 'close') {
$type = $vals [$i]['type'];

if (isset ($children [$vals [$i]['tag']])) {
if (is_array ($children [$vals [$i]['tag']])) {
$temp = array_keys ($children [$vals [$i]['tag']]);

if (is_string ($temp [0])) {
$a = $children [$vals [$i]['tag']];
unset ($children [$vals [$i]['tag']]);
$children [$vals [$i]['tag']][0] = $a;
}
} else {
$a = $children [$vals [$i]['tag']];
unset ($children [$vals [$i]['tag']]);
$children [$vals [$i]['tag']][0] = $a;
}

$children [$vals [$i]['tag']][] = GetChildren ($vals, $i, $type);
} else
$children [$vals [$i]['tag']] = GetChildren ($vals, $i, $type);

if (isset ($vals [$i]['attributes'])) {
$attributes = array ();
foreach (array_keys ($vals [$i]['attributes']) as $attkey)
$attributes [$attkey] = $vals [$i]['attributes'][$attkey];

if (isset ($children [$vals [$i]['tag']])) {

if ($children [$vals [$i]['tag']] == '') {
unset ($children [$vals [$i]['tag']]);
$children [$vals [$i]['tag']] = $attributes;
}

elseif (is_array ($children [$vals [$i]['tag']])) {
$index = count ($children [$vals [$i]['tag']]) - 1;

if ($children [$vals [$i]['tag']][$index] == '') {
unset ($children [$vals [$i]['tag']][$index]);
$children [$vals [$i]['tag']][$index] = $attributes;
}
$children [$vals [$i]['tag']][$index] = array_merge ($children [$vals [$i]['tag']][$index], $attributes);
} else {
$value = $children [$vals [$i]['tag']];
unset ($children [$vals [$i]['tag']]);
$children [$vals [$i]['tag']]['value'] = $value;
$children [$vals [$i]['tag']] = array_merge ($children [$vals [$i]['tag']], $attributes);
}
} else
$children [$vals [$i]['tag']] = $attributes;
}
}

return $children;
}


// URL du flux xml
$url = "info.xml";

$contents = file_get_contents($url);
$data = GetXMLTree ($contents);


print_r($data);



Celui ci marche sans probleme quand le fichier est pas trop gros
seulement si mon fichier XML fait 40mo ca ne marche pas
je lance le script mais rien; page blanche

si qqun peut m'aider

11 réponses

Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Bah je ne sais pas d'où il prend sa mémoire mais mets le plus grand que ton fichier que tu souhaite ouvrir.

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
soit que le temps limite a été dépassé donc mettre set_time_limit(0) mais ca métonnerait parce que tu devrais avoir une limite.

soit que ton fichier est trop gros pour l'espace alloué en mémoire

soit que php plante

soit que je sais pas :)



Je ne te donne pas de solution mais des constatation, essaie au moins la première.
display_errors est-il à on ? et error_reporting à E_ALL ?

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008

VOici l'erreur que j'ai :

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 40564120 bytes) in /home/httpd/vhosts/synetik.net/httpdocs/xml/xml-template.php on line 102
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
ma 2e réponse était la bonne... tu as atteint le maximum alloué par PHP.

Soit tu augmente le memory limit ou soit que tu parse un plus petit fichier.

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008

Ou puis je augmenter le memory limit ? et ou dois je le changer ?

Merci en tout cas
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
dans le php.ini

elle est par défaut à 8M

Mais tu ne peux pas la changer sur aucun hébergeur normalement, ni payant ni gratuit... Chez toi tu peux très bien par contre :)

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008

J'ai un serveur dédié
J'ai changé cette valeur sur plusieurs niveaux et meme arrivé a 128M ca ne change rien au soucis !

J'ai 256mo de Ram sur mon dédié
je peux pousser a combien sans altérer le serveur et la BP

ps : ce script ne tournera qu'une seule fois
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Ca a pas rapport avec la bande passante.

C'est l'utilisation de la mémoire interne pour PHP...

Si le script ne tourne qu'une seule fois, mets le haut et remets le bas après...



Si ca a répondu à ta question choisis les réponses à accepter

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008

Oui ca a repondu
Une seule question encore : jusqua combien je peux le mettre ?
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
http://ca.php.net/manual/fr/ini.core.php#ini.memory-limit

Cette option détermine la mémoire limite, en octets, qu'un script
est autorisé à allouer. Cela permet de prévenir l'utilisation de toute
la mémoire par un script mal codé. Pour utiliser cette directive, vous
devez l'avoir activé lors de la compilation. Du coup, votre ligne de
configuration devait ressembler à cela :
<var>--enable-memory-limit</var>.
Notez que vous devez positionner cette directive à -1 si vous ne voulez
aucune limite.

Depuis PHP 4.3.2 et lorsque memory_limit est actif, la fonction PHP
http://www.lookstrike.com
Messages postés
191
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
27 octobre 2008

merci