Dette burde fjerne unødvendige loops og ekstra forespørgsler, det løser måske ikke alle dine svar, men kan hjælpe dig på vej.
Jeg har ikke testet denne kode, så sørg for at køre den i et testmiljø først for at sikre, at jeg ikke lavede en simpel fejl, som kunne føre til datatab, på grund af forespørgslernes art, jeg sætter denne ansvarsfraskrivelse, TEST DET FØRST MED TESTDATA VENLIGST .
$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());
}
En nem måde at teste er at kommentere mail
del og ændre DELETE FROM
til SELECT * FROM
og gentag, hvad der kommer fra markeringen for at sikre, at de korrekte data, der skulle have været slettet, kom ud.
LÆS VENLIGST NEDENFOR
En bedre måde at gøre sletningen på er dog at bruge tabellerne ID
og gem det i $delete
. Da det ville lindre OR
sætning og minimer fejlen ved utilsigtet sletning af gyldige rækker. Her er hvordan det ville fungere (brugte lige slutningen, erstat ID
med hvad end dit id-felt er:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
OPDATERING
Jeg er ikke sikker på, hvor hurtigt dette vil køre osv. Men en mulig måde at gøre det på uden at have det inde i en løkke er:
// 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";
Igen er dette utestet, og jeg er ikke sikker på, hvor ydelsesmæssigt det ville matche. Men noget for dig at teste.
REDIGER :Ændret til fetch_assoc
i forhold til fetch_array