Page 1 sur 1

PDO : INSERT en une seule requête pour un gros tableau XML

Posté : 24 oct. 2013, 13:15
par josse34
Bonjour!
Depuis un fichier kml que je transforme et parse en xml, j'obtiens un long tableau avec 3 colonnes name / description / coordinates :
<?php
copy("METEO.kml", "METEO.xml");

    $connexion = new PDO('mysql:host=localhost;dbname=xmlmeteo', 'controlenumber', 'PASSWORD');
    $connexion->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    $connexion->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
    $connexion->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
    $connexion->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
    $connexion->query("CREATE TABLE IF NOT EXISTS xmlmeteo (description VARCHAR(8) PRIMARY KEY, name TEXT, coordinates VARCHAR(20))");
    $connexion->exec("DELETE FROM xmlmeteo");

$racine = simplexml_load_file('METEO.xml');
    
foreach ($racine->Document->Placemark as $marqueur) 
  {
    $name = $marqueur->name;
  
    $description = $marqueur->description;
    
    $racine1 = $marqueur->Point;
    $coordinates = $racine1->coordinates;
  }

    $connexion->exec('INSERT INTO xmlmeteo (description) VALUES ('.$marqueur->description.')');

?>
Si je fais une requête PDO d'insertion dans le foreach, je dépasse allègrement le temps d’exécution maximum.

Le souci étant que je ne sais pas comment faire une seule et unique requête PDO en INSERT pour tout le tableau? Le code ci-dessus n’insère logiquement que la dernière valeur connu dans le foreach de $marqueur->description.

Merci!!!!

Re: PDO : INSERT en une seule requête pour un gros tableau X

Posté : 24 oct. 2013, 22:16
par moogli
salut,

as tu essayé une requête préparée ? (une vrai ? ).

après il faut voir la taille du fichier bien entendu, tu devrait peut être essayer d'augmenter la durée de vite du script.

quelque chose comme ça :
<?php

$connexion = new PDO('mysql:host=localhost;dbname=xmlmeteo', 'controlenumber', 'PASSWORD');
$connexion->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$connexion->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$connexion->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$connexion->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
$connexion->query("CREATE TABLE IF NOT EXISTS xmlmeteo (description VARCHAR(8) PRIMARY KEY, name TEXT, coordinates VARCHAR(20))");
$connexion->exec("DELETE FROM xmlmeteo");
$stmt = $connexion->prepare('INSERT INTO xmlmeteo (description) VALUES (:desc)');

$racine = simplexml_load_file('METEO.kml');

foreach ($racine->Document->Placemark as $marqueur) {
    $stmt->bindValue(':desc', $marqueur->description);
    $stmt->execute();
}

$stmt->closeCursor();

Re: PDO : INSERT en une seule requête pour un gros tableau X

Posté : 24 oct. 2013, 22:46
par josse34
Comme d'habitude, tu es un prince! Ce code marche parfaitement =D>

Cependant et si je ne me trompe pas, un execute est réalisé à chaque boucle, ce qui induit un traitement de "seulement" 311 lignes en 30 secondes, seuil du maximum execution time.
Mon fichier peut grimper à 1000 lignes, j'ai besoin de diviser par minimum 3 ce temps de traitement.

N'est il donc pas possible de réduire considérablement ce temps en ne réalisant qu'une seule injection à la fin?

Merci!

Re: PDO : INSERT en une seule requête pour un gros tableau X

Posté : 25 oct. 2013, 07:24
par moogli
Avec mysql tu peux ajouter value a la suite :
Insert into latable (les, champs) values (...) , (...), (...) etc
A voir si cela sera mieux

Je m'étonne quand même que tu n'insere que 300 lignes en 30s
Tu test en local ?
Faudrait profiler le scripts avec xdebug pour voir ce qui prend le plus de temps.


@+

Re: PDO : INSERT en une seule requête pour un gros tableau X

Posté : 25 oct. 2013, 10:24
par josse34
Waouh!
Effectivement, sur EasyPHP, 311 lignes en 30 secondes et blocage mais sur mon serveur à peine 1 secondes pour 469 lignes!
C'était tellement rapide que je croyais que ça ne fonctionnais pas et commençais à debugger!
D'autant que en local j'ai réussi une fois à en insérer 409 pour 64Ko alors que 469 sur mon serveur ne prennent que 29Ko!
La puissance de PHP m'ettonera toujours!
Résolu, merci!
Bye