Optimisation script PHP et Mysql
Bonjour,
Désolé si je ne suis pas dans le bon forum, mais cela concerne aussi bien php que Mysql.
Mon pb est le suivant : j'ai un script qui va chercher dans ma db des adresses mails. Ensuite via le webservice de mon routeur de mail de masse, je récupère le statut du mail en question (spam, adresse inexistante, ...) et met à jour cette valeur dans ma db.
J'ai remarqué que pour environ 1500 adresses mails, le temps d'exécution était bien trop long pour si peux d'adresse et que dernièrement je suis même tombé en time out (erreur 504).
Voici mon script et dite moi comment l'optimiser.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| //--- recherche des groupes de contacts ayant envoyé une campagne a J-1
$sql = 'SELECT newsletter.id_groupe, newsletter_groupe.libelle, newsletter_client.societe
FROM newsletter
LEFT JOIN newsletter_groupe ON newsletter_groupe.id_groupe = newsletter.id_groupe
LEFT JOIN newsletter_client ON newsletter_client.id_client = newsletter.id_client
WHERE TO_DAYS(NOW()) - TO_DAYS(newsletter.post_date) <= 1
GROUP BY newsletter.id_groupe' ;
$query = mysql_query($sql) or die (mysql_error());
$nbgroupe = mysql_num_rows($query);
if($nbgroupe >= 1)
{
//--- boucle sur les groupes retournés
while ($groupe = mysql_fetch_assoc($query))
{
$i = 0;
//--- recherche des abonnés
$sqlabo = 'SELECT newsletter_abonne.id_abonne, newsletter_abonne.cle, newsletter_abonne.mail, newsletter_abonne.etat
FROM newsletter_abonne
WHERE newsletter_abonne.id_groupe = ' . $groupe['id_groupe'] . ' ' ;
$queryabo = mysql_query($sqlabo) or die (mysql_error());
//--- boucle sur les abonnées du groupe
while ($abo = mysql_fetch_assoc($queryabo))
{
$i++;
$statut = Newsletter::MJStatutMailAbo($abo['mail']);
if($statut['unsub'] == 1) { $etat = 2 ; }
elseif($statut['bounce'] >= 1 && $statut['blocked'] == 0 && $statut['spam'] == 0 && $statut['unsub'] == 0) { $etat = 3 ; }
elseif($statut['blocked'] >= 1) { $etat = 4 ; }
elseif($statut['spam'] >= 1) { $etat = 5 ; }
//--- pour réduire le nb de requête la MAJ se fait uniquement si l'état est différent de la valeur en DB.
if($etat != $abo['etat'])
{
//--- Met à jour l'état d'un destinataire
$sql = 'UPDATE newsletter_abonne
SET newsletter_abonne.etat = '.$etat.', newsletter_abonne.derniere_modification = Now()
WHERE newsletter_abonne.mail = \'' . $abo['mail'] . '\'
AND newsletter_abonne.id_groupe = ' . $groupe['id_groupe'] . '' ;
$Result = mysql_query($sql) or die(mysql_error()) ;
}
}
$html.='Mise à jour de ' . $i . ' statut'.($i >=2 ? 's' : '').' d\'abonné pour le groupe "' . stripslashes($groupe['libelle']) . '" du client ' . stripslashes($groupe['societe']) . '<br />' ;
}
return $html;
} |
D'avance merci pour vos retours