Bonjour,
Je post ce message car j'ai un petit soucis avec PDO et les requêtes longues en terme de temps d'éxécution comme DELETE/OPTIMIZE/REPAIR ou TRUNCATE.
Je suis passé à PDO la semaine dernière et forcément j'ai encore quelques lacunes :p
Je développe des passerelles clientes qui me permettent de transmettre des annonces d'un site immobilier à un autre.
Il y a donc un flux important de données, quotidien.
J'ai des bases de données qu'on pourrait qualifier de transition qui me permettent de faire les premiers traitements avant envoi sur la base principale.
Je traite donc les informations dans les bases de transition puis les envoi dans la base principale. Une fois ce traitement effectuée je vide les tables de transition qui peuvent contenir plus de 50 000 lignes et je supprime les annonces obsolètes de ma base principale.
Voici comment je raisonnais pour suppression avant avec mysql_query :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php // Exemple 1 pour supprimer quelques annonce $delete_id = mysql_query("DELETE FROM annonce WHERE date_maj!='$date_du_jour'"); // Le nombre de suppression peut être important > 5000 par jour // Exemple 2 pour supprimer la base complète $truncate = mysql_query("TRUNCATE TABLE transition"); // Peut être supérieur à 50 000 par jour. // Ensuite pour maintenir ma table en vie et ne pas la cracher j'utilisais OPTIMIZE & REPAIR $optimize = mysql_query("OPTIMIZE TABLE annonce"); $optimize = mysql_query("OPTIMIZE TABLE transition"); // Puis Repair $repair = mysql_query("REPAIR TABLE annonce"); $optimize = mysql_query("REPAIR TABLE transition"); ?>
1/ Était-ce une bonne façon de faire sous mysql_query ?
2/ Voici ce que cela me donne maintenant sous PDO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <?php $delete_id = $pdo->exec("DELETE FROM annonce WHERE date_maj!='$date_du_jour'"); // Le nombre de suppression peut être important > 5000 par jour // Exemple 2 pour supprimer la base complète $truncate = $pdo->exec("TRUNCATE TABLE transition"); // Peut être supérieur à 50 000 par jour. // Ensuite pour maintenir ma table en vie et ne pas la cracher j'utilisais OPTIMIZE & REPAIR $optimize = $pdo->exec("OPTIMIZE TABLE annonce"); $optimize = $pdo->exec("OPTIMIZE TABLE transition"); // Puis Repair $repair = $pdo->exec("REPAIR TABLE annonce"); $optimize = $pdo->exec("REPAIR TABLE transition"); ?>
Mon problème :
Avant tout fonctionnait bien.. mais ça c'était avant.. :p.. bon ok
Ces requêtes se validaient bien avec mysql_query et aucune erreur ne s'affichait et bien plus maintenant..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php Warning: PDO::exec() [pdo.exec]: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in /home/ on line 984 ?>
A/ Soit il n'y a plus besoin ou il n'y a jamais eu besoin de faire OPTIMIZE / REPAIR ?
B/ Soit les requêtes sont lentes et du coup l'action n'est pas fini quand PHP ordonne la seconde action et du coup tout plante ?
Je souhaite préserver au mieux ma base..
Merci![]()
Partager