Cela devrait supprimer les boucles inutiles et les requêtes supplémentaires, cela peut ne pas résoudre toutes vos réponses, mais peut vous aider en cours de route.
Je n'ai pas testé ce code, alors assurez-vous de l'exécuter d'abord dans un environnement de test pour vous assurer que je n'ai pas fait une simple erreur qui pourrait entraîner une perte de données, en raison de la nature des requêtes, j'ai mis cet avertissement, TESTEZ-LE D'ABORD AVEC DES DONNÉES DE TEST S'IL VOUS PLAÎT .
$rest_max = '200';
$query = "SELECT *
FROM `mailer_lists` ml
JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
WHERE `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;
$result = mysql_query($query) or die(mysql_error());
$delete=array();
while($row = mysql_fetch_assoc($result)){
$email = $row['email'];
$project_name = $rowa['project_name'];
$from_name = $rowa['from_name'];
$from_email = $rowa['from_name']."@".$node_domain;
$subject = $rowa['subject'];
$body = $rowa['body'];
$content = addslashes($body);
// set header
$header_from = 'From: '.$from_name.' <'.$from_email.'>';
$header_reply_to = '-f '.$from_email;
// send mail
mail($email,$subject,$body,$header_from,$header_reply_to);
$delete[] = " (project_name = '$project_name' AND email = '$email') ";
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE " . implode(' OR ', $delete)) or die(mysql_error());
}
Un moyen simple de tester est de commenter le mail
partie et modifiez le DELETE FROM
à SELECT * FROM
et faites écho à ce qui vient de la sélection pour vous assurer que les données appropriées qui auraient dû être supprimées sont sorties.
VEUILLEZ LIRE CI-DESSOUS
Une meilleure façon de faire la suppression, cependant, est d'utiliser les tables ID
champ et stockez-le dans le $delete
. Comme cela atténuerait le OR
déclaration et minimiser l'erreur de suppression accidentelle de lignes valides. Voici comment cela fonctionnerait (juste utilisé la fin, remplacez ID
quel que soit votre champ d'identification :
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
MISE À JOUR
Je ne sais pas à quelle vitesse cela fonctionnera, etc. Mais une façon possible de le faire, sans l'avoir à l'intérieur d'une boucle est :
// Fill the array however you want to with the domains. this is just an example
$throttle = array('domain1.com', 'domain2.com', 'domain3.com');
$query = "SELECT *
FROM `mailer_lists` ml
JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
WHERE `email` LIKE '%". implode("' OR `email` LIKE '%", $throttle) . "' LIMIT ".$trim_speed." ORDER BY project_name, email";
Encore une fois, cela n'a pas été testé et je ne sais pas à quel point cela correspondrait en termes de performances. Mais quelque chose à tester.
MODIFIER :Changé en fetch_assoc
par opposition à fetch_array