Bonjour à tous,
Ca fait un petit moment que je me prends la tête sur la performance de mon code et notamment la vitesse d'exécution d'une boucle foreach.
J'ai un tableau de taille différente que je parcours dans le but de créer un autre tableau et afin d'insérer le nouveau tableau dans la BDD.
Le problème survient lorsque le tableau arrive à une taille supérieure à 5000 entrées.
Pour donner un ordre d'idée, la durée de la boucle foreach pour un tableau de 16000 entrées met environ 23 secondes à s'exécuter. Au sein de la boucle foreach, je fais 2 appels à la BDD. Chaque requête met moins de 0.001 seconde à s'exécuter. La requête d'insert met quant à elle 0.01 seconde.
Voici mon code, modifié car il s'agit d'un projet d'entreprise...
$bulkSize = 100;
$i = $j = 0;
foreach ($data['products'] as $product) {
$actions[$j]['aze'] = [...];
// première requête SQL
$actions[$j]['qsd'] = [...];
// seconde requête SQL
$actions[$j]['qsd'] = \array_merge($actions[$j]['qsd'], [...]);
$j++;
if (($i % $bulkSize) === 0) {
if (count($actions)) {
// update BDD
// si aucune erreur
$actions = [];
$j = 0;
}
}
$i++;
}
if (count($actions)) {
// update BDD
}
Ce que j'aimerais, c'est avoir un temps d'exécution réduit pour les tableaux avec de nombreuses entrées...
Avez-vous une idée de comment faire ?
Merci d'avance pour vos réponses !
Salut !
J'ai déjà essayé en découpant ma data brut en chunks (taille 100). Malheureusement, j'ai toujours un temps d'exécution aussi important voire plus important.
Je pense que la classe parallel de PHP que tu me donnes comme exemple serait une bonne chose. Le problème, c'est que notre serveur tourne sous PHP 7.1.
Si je n'ai pas d'autres solutions, je vais essayer de mettre en place quelque chose qui ressemble à ceci