[RESOLU] Problème pour parser un gros fichier xml

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Problème pour parser un gros fichier xml

Re: Problème pour parser un gros fichier xml

par yann18 » 23 juin 2015, 17:50

simple_xml (issue de DOM) n'est pas adapté au traitement de gros fichiers car il charge en mémoire tout le document xml avant d'effectuer le parsing.
En revanche xmlreader, lit nœud par par neoud puis déplace le curseur sur le prochain noeud.Ce type de parseur convient pour traiter de gros fichiers.

Un parseur comme SAX pourra aussi faire l'affaire.

En général ce type de traitement est toujours effectué en tâche de fond.

Re: Problème pour parser un gros fichier xml

par foayiid » 23 juin 2015, 17:46

bonne idée ! Merci Saian

Re: Problème pour parser un gros fichier xml

par Saian » 23 juin 2015, 16:50

Etant donné que le script boucle sur une liste de produit provenant d'un fichier XML, il ne devrait pas y avoir de risque de boucle infinie.

En revanche un internaute malveillant pourrait en effet d'une manière ou d'une autre appeler le script à répétition et provoquer une surcharge du serveur.
Ceci dit il faut déjà qu'il y ait la volonté de causer du tord au site et il faut ensuite trouver le script.

Comme le but est de l'exécuter via tâche cron tu pourrais simplement ajouter un test au début du fichier n'autorisant que l'ip du serveur exécutant la tâche cron.

Re: Problème pour parser un gros fichier xml

par foayiid » 23 juin 2015, 16:36

Merci pour ton retour !
A ton avis, si je règle le set_time_limit à 0 cela ne pose t-il pas un problème de sécurité au cas ou un programme malveillant (ou mal-conçu) tombe dans une boucle infinie par exemple ?

Re: Problème pour parser un gros fichier xml

par Saian » 23 juin 2015, 14:53

Si tu ne veux pas avoir de limite de temps lors de l'exécution de ton script, met un set_time_limit(0); au début.

PS : set_time_limit n'est pas une directive de configuration c'est une fonction. Donc dire qu'on a mit la directive set_time_limit = 600000 n'a pas de sens.

Re: Problème pour parser un gros fichier xml

par foayiid » 23 juin 2015, 13:42

Re-bonjour,
Je suis sur un serveur dédié online.net.
Non pas de safe mode.
Voici mes directives :
set_time_limit = 600000
max_execution_time = 600000
memory_limit = 64M

Re: Problème pour parser un gros fichier xml

par Saian » 23 juin 2015, 12:32

Salut foayiid, quel est ton hébergement ? peut être y a-t-il une limitation liée à l'hébergement concernant la fonction set_time_limit et la directive max_execution_time (qui au passage ne boostent pas la limite mémoire mais déterminent la durée d'exécution maximum d'un script).
Le safe mode ne serait-il pas activé ?

Problème pour parser un gros fichier xml

par foayiid » 22 juin 2015, 18:14

Bonjour a tous,

J'ai un problème de taille ... c'est le cas de le dire.
Je dois parser un fichier XML pour l'importer dans une boutique Prestashop (via l'outil webservice).

J'ai créé mes fonctions qui testent si le produit est présent, mettent à jour le fournisseur, les images, les données ....
Tout va bien de ce côté là, lorsque je travaille sur un fichier XML ne contenant qu'un seul produit.
Le problème vient quand j'augmente le nombre de produits (100 par exemple) j'ai ce type d'erreur
Le délai d'attente est dépassé
Le serveur à l'adresse mon-domaine.fr met trop de temps à répondre.
J'ai pourtant boosté la limite memoire (set_time_limit, max_execution_time, ...) mais rien y fait.
Le problème c'est que mon fichier de production fait plus de 22 000 produits ...

j'utilise une boucle

Code : Tout sélectionner

libxml_use_internal_errors(true); $xml = simplexml_load_file($fichier_source); //gestion des erreurs ... foreach($xml->produit as $produit ) { //traitement des produits }
Existe-il une meilleure solution ? (sachant que je dois automatiser la tâche par un CRON, donc je ne peux pas utiliser d'AJAX [damm !] )
Merci de votre aide.