par
moogli » 24 mai 2013, 20:15
ben déja tu ne fera ces 3 instructions que 3 fois au lieu de 3 x 100000, du coup tu gagne 300000 - 3 = 299997 fois gagné.
sachant que si tu demande une requete préparé serveur c'est 299997 accès réseau gagné
ajoute à cela que ton code est pas super correct (par exemple les test pour les messages d'erreur ne peuvent échouer par tu test des objets créer avant et quand une requête, avec le méthode execute de l' objet pdostatement, échoue tu a false en retour.
donc ton code serait un poil plus performant ainsi
<?php
$db = FonctionConnBdd();
$db = new PDO('');
$MaxExe = 50;
// Préparation des requêtes
$TryLine = $db->prepare('SELECT coun(1) as nb FROM Matable WHERE var1=:var1 AND var2=:var2');
$UpdateLine = $db->prepare('UPDATE Matable SET var5=:var5 WHERE var1=:var1 AND var2=:var2');
$InsertLine = $db->prepare('INSERT INTO Matable (var1,var2,var3,var4,var5) VALUES (:var1,:var2,:var3,:var4,:var5)');
for ($i = 0; $i < $MaxExe; $i++) {
$Source = 'http://urlsource.fr/fichier.txt'; // c'est pas un tableau hein :)
if (!is_array($Source)) {
echo 'Erreur Source';
} else {
foreach ($Source as $src) {
list($var1, $var2, $var3, $var4, $var5) = explode(',', $src);
// Vérification de la présence dans la base
$ret = $TryLine->execute(array('var1' => $var1, 'var2' => $var2));
$data = $TryLine->fetchAll();
$CountLine = $data[0]['nb'];
$TryLine->closeCursor();
// Si existant -> update
if ($CountLine == 1) {
$ret = $UpdateLine->execute(array('var1' => $var1, 'var2' => $var2, 'var5' => $var5));
if ($ret === false) {
$err = $InsertLine->errorInfo();
echo 'Erreur Insert: ' . $err[2];
}
}
// Fin CountLine->1
if ($CountLine == 0) {
$ret = $InsertLine->execute(array(
'var1' => $var1, 'var2' => $var2, 'var3' => $var3, 'var4' => $var4, 'var5' => $var5));
if ($ret === false) {
$err = $InsertLine->errorInfo();
echo 'Erreur Insert: ' . $err[2];
}
} // Fin CountLine->0
}
// Fin Foreach
}
}
?>
ensuit suivant le volume des fichier il peux être intéressant de faire faire le boulot par le sgbd si cela est possible, genre un load data in file avec mysql, ou avec oracle du code (et surement d'autre) du code pl qui va parser le fichier.
Il faut voir si des procédures stockées ne serait pas plus performant que des requêtes préparées.
A tester
@+
ben déja tu ne fera ces 3 instructions que 3 fois au lieu de 3 x 100000, du coup tu gagne 300000 - 3 = 299997 fois gagné.
sachant que si tu demande une requete préparé serveur c'est 299997 accès réseau gagné :mrgreen:
ajoute à cela que ton code est pas super correct (par exemple les test pour les messages d'erreur ne peuvent échouer par tu test des objets créer avant et quand une requête, avec le méthode execute de l' objet pdostatement, échoue tu a false en retour.
donc ton code serait un poil plus performant ainsi
[php]<?php
$db = FonctionConnBdd();
$db = new PDO('');
$MaxExe = 50;
// Préparation des requêtes
$TryLine = $db->prepare('SELECT coun(1) as nb FROM Matable WHERE var1=:var1 AND var2=:var2');
$UpdateLine = $db->prepare('UPDATE Matable SET var5=:var5 WHERE var1=:var1 AND var2=:var2');
$InsertLine = $db->prepare('INSERT INTO Matable (var1,var2,var3,var4,var5) VALUES (:var1,:var2,:var3,:var4,:var5)');
for ($i = 0; $i < $MaxExe; $i++) {
$Source = 'http://urlsource.fr/fichier.txt'; // c'est pas un tableau hein :)
if (!is_array($Source)) {
echo 'Erreur Source';
} else {
foreach ($Source as $src) {
list($var1, $var2, $var3, $var4, $var5) = explode(',', $src);
// Vérification de la présence dans la base
$ret = $TryLine->execute(array('var1' => $var1, 'var2' => $var2));
$data = $TryLine->fetchAll();
$CountLine = $data[0]['nb'];
$TryLine->closeCursor();
// Si existant -> update
if ($CountLine == 1) {
$ret = $UpdateLine->execute(array('var1' => $var1, 'var2' => $var2, 'var5' => $var5));
if ($ret === false) {
$err = $InsertLine->errorInfo();
echo 'Erreur Insert: ' . $err[2];
}
}
// Fin CountLine->1
if ($CountLine == 0) {
$ret = $InsertLine->execute(array(
'var1' => $var1, 'var2' => $var2, 'var3' => $var3, 'var4' => $var4, 'var5' => $var5));
if ($ret === false) {
$err = $InsertLine->errorInfo();
echo 'Erreur Insert: ' . $err[2];
}
} // Fin CountLine->0
}
// Fin Foreach
}
}
?>[/php]
ensuit suivant le volume des fichier il peux être intéressant de faire faire le boulot par le sgbd si cela est possible, genre un load data in file avec mysql, ou avec oracle du code (et surement d'autre) du code pl qui va parser le fichier.
Il faut voir si des procédures stockées ne serait pas plus performant que des requêtes préparées.
A tester
@+