Cherche solution pour export XML grosse base de donnée

Messagepar Rwan » Lun 08 Juin 2009, 23:48

Bonjour à tous,
je suis confronté à un problème d'export d'une très grosse base de donnée (20 000 réfs!) afin d'y créer un flux ou encore un fichier XML formaté pour les comparateurs de prix.
J'ai écri un script utilisant la (très pratique) fonction XMLWriter() qui est très facile à mettre en place et moins gourmande en ressources que les méthodes habituelles (comme google_sitmap.php...) dont voici le fragment de code :
Code: Tout sélectionner
xml_writer.php (fragment)

<?php
ini_set("memory_limit",32000000);
require('includes/application_top.php');
 
// Nouvelle Instance de la classe XMLWriter
$X = new XMLWriter();
// Nouveau XMLWriter en mémoire
$X->openMemory();
// Nouvel XMLWriter dans un fichier
//$X->openUri('nom_fichier.xml');
//
$X->setIndent(true);
// Nouveau document XML 1.0 avec un encodage ISO-8859-1
$X->startDocument('1.0', 'ISO-8859-1');
// Commentaires
$X->writeComment('created : '.date("d-m-Y H:i:s"));
// Tag principal : <root> [1]
$X->startElement ('catalogue');
$X->writeAttribute('lang' , 'FR');
$X->writeAttribute('date' , strftime(DATE_FORMAT_SHORT));

// Lecture des tables ...
// select table products extraction id et model
$i=1;
$products_info_query = tep_db_query("select * FROM osc_products WHERE products_status = '1' ORDER BY 'products_model' DESC ");
// start while
while($products = tep_db_fetch_array($products_info_query)) {
$products_id=$products['products_id'];
$products_quantity =$products['products_quantity'];
$products_model=$products['products_model'];
$products_image=$products['products_image'];
$products_price=$products['products_price'];
$products_weight=$products['products_weight'];
$manufacturers_id=$products['manufacturers_id'];
$products_status =$products['products_status'];

// etc etc...

// GENERER LE XML
// Tag : <tag>value</tag>
$X->startElement('produit'); $X->writeAttribute('num', $i);
$X->startElement('nom'); $X->writeCdata($products_name); $X->endElement();
$X->startElement('marque'); $X->writeCdata($manufacturers_name); $X->endElement();
$X->startElement('refinterne'); $X->writeCdata($products_id); $X->endElement();
$X->startElement('reference'); $X->writeCdata($products_model); $X->endElement();
$X->startElement('prix'); $X->writeAttribute('monnaie' , 'EUR'); $X->writeCdata($products_price);$X->endElement();
$X->startElement('fp'); $X->writeAttribute( 'monnaie' , 'EUR'); $X->writeCdata($fp);$X->endElement();
$X->startElement('eco-participation'); $X->writeCdata($ecotaxe); $X->endElement();
$X->startElement('disponibilite'); $X->writeCdata($dispo); $X->endElement();
$X->startElement('promo'); $X->writeCdata($promo); $X->endElement();
$X->startElement('description'); $X->writeCdata($products_description); $X->endElement();
$X->startElement('url'); $X->writeCdata(HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'product_info.php?products_id=' . $products_id); $X->endElement();
$X->startElement('img'); $X->writeCdata(HTTP_SERVER . DIR_WS_HTTP_CATALOG. DIR_WS_IMAGES .$products_image); $X->endElement();
$X->startElement('imgnorm'); $X->writeCdata(HTTP_SERVER . DIR_WS_HTTP_CATALOG. DIR_WS_IMAGES .$products_image_med); $X->endElement();
$X->endElement();
$i++;
}
// end
// [1] Fermeture du tag principal
$X->endElement();
// Enregistrement du résultat
//$X->flush();
// Affichage du résultat
echo $X->flush();
?>

J'ai en fait un problème de mémoire saturée, que ce soit par flux en mémoire ou en écriture fichier sur le serveur . J'ai donc ajouté la ligne ini_set("memory_limit",32000000); ceci améliorant sensiblement la poursuite du processus mais sans succès d'aboutissement , j'ai l'erreur :

Fatal error: Allowed memory size of 32000000 bytes exhausted (tried to allocate 17526911 bytes)

Le fait d'allouer plus d'espace mémoire (64Mo maxi) ne permet pas de finir la routine non plus.
Mon site OSCSS est hébergé sur un serveur dédié OVH.
Existe-il une méthode comme par exemple scinder le contenu en plusieurs fichiers puis de les ré assembler en un seul ?
Quelqu'un a t-il déjà été confronté à ce problème ?
Dernière édition par Rwan le Lun 08 Juin 2009, 23:49, édité 1 fois.
OSCSS 1.2.1 - PHP Version 5.2.5-pl1-gentoo - MySQL 5.0.44-log
contribs :
captcha for contact_us.php, visitors v2.3a, featured products v1.1, Easypopulate 2.76g-ms2, quick updates v2.4, define mainpage v1.2, paiement Sips ATOS e-transaction Credit Agricole, paiement mandatorder v1.10, down for maintenance...
Rwan
Contributeurs
 
Messages: 29
Inscription: Mar 17 Juin 2008, 21:38

Messagepar j4k » Mar 09 Juin 2009, 12:06

A essayer cette classe qui permet de lire le fichier de façon séquentielle :

http://www.php-experts.org/developpemen ... lreader-42

fait nous part de ton expérience sur ce sujet la
~ osCSS 1.2.1 ~
Avatar de l’utilisateur
j4k
Site Admin
 
Messages: 1259
Inscription: Mer 27 Avr 2005, 09:13
Localisation: France

Messagepar Rwan » Mar 09 Juin 2009, 20:34

Merci bien J4F, je testerai donc cette methode en espérant un bon résulat ;)
OSCSS 1.2.1 - PHP Version 5.2.5-pl1-gentoo - MySQL 5.0.44-log
contribs :
captcha for contact_us.php, visitors v2.3a, featured products v1.1, Easypopulate 2.76g-ms2, quick updates v2.4, define mainpage v1.2, paiement Sips ATOS e-transaction Credit Agricole, paiement mandatorder v1.10, down for maintenance...
Rwan
Contributeurs
 
Messages: 29
Inscription: Mar 17 Juin 2008, 21:38


Retourner vers Developpement

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron