Probleme avec un parser XML vers PHP

Résolu
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008 - 15 août 2005 à 21:22
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008 - 15 août 2005 à 22:18
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

cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 22:11
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
3
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 21:29
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
0
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008
15 août 2005 à 21:33
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
0
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 21:39
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008
15 août 2005 à 21:40
Ou puis je augmenter le memory limit ? et ou dois je le changer ?

Merci en tout cas
0
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 21:44
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
0
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008
15 août 2005 à 21:46
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
0
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 21:49
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
0
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008
15 août 2005 à 21:51
Oui ca a repondu
Une seule question encore : jusqua combien je peux le mettre ?
0
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
15 août 2005 à 22:16
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
0
foliop Messages postés 191 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 27 octobre 2008
15 août 2005 à 22:18
merci
0
Rejoignez-nous