Questions concernant le parsing de flux XML en PHP

WRInaute accro
BOnjour,

Je suis totalement novice en ce qui concerne la gestion / parsing de flux XML avec PHP.
J'ai découvert SimpleXML, c'est super.
D'habitude je travaille avec MySQL mais là le flux XML vient de l'externe et doit être mis à jour toutes les 24h donc je ne peux pas passer par une BDD.

Seulement le flux fait 500 Mo...
Questions :
Je pense récupérer le flux tous les jours à minuit, le stocker en local puis le charger via :
$flux = simplexml_load_file($xml);
Cette fonction va charger tout le flux en RAM ? Si oui mon serveur va exploser rapidement.
Et ça va être très lent non ? (parser un flux de 500 Mo à chaque page...).
Avec une BDD on ne charge que la / les lignes qui nous intéressent avec les champs qu'on veut.

Quel est le fonctionnement concret et quelles sont les ressources utilisées par le système pour un flux XML ?

Merci
 
WRInaute discret
Bonjour,

il existe 2 méthodes pour parser un flux XML:
- DOM : le fichier est lu en entier pour construire un arbre avec les données. Tout le fichier est effectivement en RAM.
fonctions de type simplexml_load_file, XPath, ...
- SAX: le XML est lu au fur et à mesure. A chaque nœud, plusieurs évènements sont déclenchés dont on se sert en général pour alimenter un liste de donnée.

Avec 500Mo, la méthode SAX est la solution qui consomme le moins de ressources.
As-tu déjà fait des tests avec le flux XML ?
 
WRInaute accro
Bonjour,

Merci.

En fait pour l'instant j'utilise tout simplement ceci pour afficher mon flux :
Code:
$xml = 'xml/monflux.xml';
$flux = simplexml_load_file($xml);
foreach($flux->store->products->product as $product){
echo $product->title.'<br />';
}
Pour faire des essais. Je suis sur PHP5.
Ca m'affiche tous les titres soit des milliers de lignes.

Je voudrais faire des sortes de SELECT (comme sur MySQL) dans ce flux mais je ne vois pas comment faire.
Et pour tout dire, je n'ai pas compris la différence entre DOM, SimpleXML etc. C'est du chinois pour moi.

En fait j'aborde l'XML dans une logique base de données, tu vois ?

Exemple de flux :
Code:
<?xml version="1.0" encoding="UTF-8"?>
<catalogue>
<store>
  <name>Vendeur 1</name>
  <products>
   <product>
    <trademark>Intel</trademark>
    <title>Intel Core i5 760</title>
    <desc>Un bon CPU pour tous les usages.</desc>
   </product>
   <product>
    <trademark>Intel</trademark>
    <title>Intel Core i7 760</title>
    <desc>Un CPU pour les applications exigeantes</desc>
   </product>
   <product>
    <trademark>AMD</trademark>
    <title>AMD Phenom II X6</title>
    <desc>Un CPU pour les serveurs</desc>
   </product>
  </products>
</store>
<catalogue>

Ici, par exemple, je voudrais pouvoir faire un genre de requête pour n'afficher le "title" QUE des CPU AMD et du vendeur 'Vendeur 1' (en imaginant qu'il y a 20 vendeurs différents).

Et c'est justement sur cette extraction que je bloque.
 
WRInaute passionné
Pour ton fichier .xml qui fait 500Mo, je pense que PHP va subir.
Si tu es sous dedié, tu pourrais faire quelques tests.

Sinon, Simple_XML est la solution oui.
Si avant tu faisais un :
Code:
SELECT trademark, title, desc FROM product
puis un :
Code:
while ($arr = mysql_fetch_assoc($query)) {

}
Là avec ton foreach, c'est pareil.
Sauf que tu dois store quelque part avant d'analyser.
A ta place je rentrerais tout dans mysql avec ton foreach
Code:
foreach ...
INSERT INTO $xml->bla->blb->blc
et après avec ta requête.

Tu fais quoi comme type de SELECT ?
Sinon, en bash un:
cat fichier.xml | grep "ce que tu cherche"
 
Nouveau WRInaute
bonjour, j'ai un souci avec le flux xml, en faite moi je cherche une fonction qui charge juste une partie de fichier xml, et ce fichier xml se trouve dans une adresse, donc elle parse juste une partie de ce flux et pas le fichier en entier, il existe un moyen de lire un flux xml en indiquant l'adresse de fichier xml et la partie a parser? merci de me répondre car j'ai cherché pas mal de tutoriels mais j'ai pas trouvé mon cas, SVP aider moi!
 
Discussions similaires
Haut