Questo dovrebbe rimuovere i loop non necessari e le query extra, questo potrebbe non risolvere tutte le tue risposte, ma potrebbe aiutarti lungo la strada.
Non ho testato questo codice, quindi assicurati di eseguirlo prima in un ambiente di test per assicurarti di non aver commesso un semplice errore che potrebbe portare alla perdita di dati, a causa della natura delle query, ho inserito questo disclaimer, PROVA PRIMA CON I DATI DI PROVA PER FAVORE .
$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 modo semplice per testare è commentare la mail
parte e cambia il DELETE FROM
a SELECT * FROM
e fai eco a ciò che viene dalla selezione per assicurarti che i dati corretti che avrebbero dovuto essere eliminati siano usciti.
LEGGERE QUI SOTTO
Un modo migliore per eliminare, tuttavia, è utilizzare il ID
delle tabelle campo e salvalo nel $delete
. Poiché ciò allevierebbe il OR
istruzione e ridurre al minimo l'errore di eliminazione accidentale di righe valide. Ecco come funzionerebbe (usa solo il finale, sostituisci ID
con qualunque sia il tuo campo ID:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
AGGIORNAMENTO
Non sono sicuro di quanto velocemente funzionerà, ecc. Ma un possibile modo per farlo, senza averlo all'interno di un ciclo è:
// 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";
Anche in questo caso non è stato testato e non sono sicuro di quanto potrebbe corrispondere in termini di prestazioni. Ma qualcosa per te da testare.
MODIFICA :Modificato in fetch_assoc
rispetto a fetch_array