Это должно удалить ненужные циклы и лишние запросы, это может решить не все ваши ответы, но может помочь вам на этом пути.
Я не тестировал этот код, поэтому сначала обязательно запустите его в тестовой среде, чтобы убедиться, что я не допустил простой ошибки, которая может привести к потере данных из-за характера запросов. заявление об отказе от ответственности, ПРОВЕРЬТЕ ПЕРВЫЕ С ДАННЫМИ ИСПЫТАНИЯ, ПОЖАЛУЙСТА .
$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());
}
Простой способ проверки - закомментировать часть mail
, изменить DELETE FROM
на SELECT * FROM
и повторить то, что исходит от выбора, чтобы убедиться, что были получены правильные данные, которые должны были быть удалены.
ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ НИЖЕ
Однако лучший способ сделать это - использовать поле Tables ID
и сохранить его в $delete
. Это уменьшит оператор OR
и минимизирует ошибку случайного удаления допустимых строк. Вот как это будет работать (просто используйте окончание, замените ID
на любое поле идентификатора:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
UPDATE
Я не уверен, насколько быстро это будет происходить и т. Д. Но один из возможных способов сделать это, не имея его внутри цикла:
// 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";
Опять же, это не проверено, и я не уверен, насколько он будет соответствовать производительности. Но кое-что для вас, чтобы проверить.
РЕДАКТИРОВАТЬ : изменено на fetch_assoc
по сравнению с fetch_array