Массовая рассылка: цикл с ajax-вызовами зависает случайным образом
У меня есть плагин WordPress, который отправляет до 3200 информационных бюллетеней каждую неделю нашим подписчикам. Однако иногда зависает после 800, иногда после 1200 писем (всегда по-другому, определенного шаблона нет). Мы используем Turbo SMTP в качестве нашего хоста.
Вот как я это делаю:
Я перебираю строки таблицы, где хранятся все почтовые адреса, и запускаю ajax-вызов для каждой строки.
// *** massmailer.php ****
// get total count of subscribers
$sqlAll = "SELECT * FROM subscribers";
$resultAll = mysql_query($sqlAll);
$numrowsAll = mysql_num_rows($resultAll);
// send mail for each subscriber, increasing row pointer $i each time
$sql = "SELECT * FROM subscribers LIMIT $i, 1";
$result = mysql_query($sql);
while ($guy = mysql_fetch_array($result)):
$mail = new PHPMailer();
$mail->Host = 'pro.turbo-smtp.com';
.... (other smtp settings here)
$mail->Send();
$i ++; // increase the row pointer by 1
// if row is NOT the last in the table, repeat this step for the next row
if ($i < $numrowsAll) {
echo "<script>$('#placeholder_massmailer').append($('<div>').load('massmailer.php?i=<? echo $i ?>'))</script>";
}
endwhile;
Это работает отлично, но иногда швы вызова $.load ajax замирают после определенного количества вызовов ajax.
Должен ли я использовать другую архитектуру? $.Post лучше для этого? Он работает как часть плагина WordPress; когда он замерзает, я замечаю, что WordPress пытается отправить ajax-вызов "heartbeat"?
спасибо Матиас
1 ответ
Как и другие, предложили создать реальную программу (java/c/etc), которая может выполнять эту функцию на стороне сервера и обновлять запись в базе данных для текущего состояния выполнения.
Тогда ваш интерфейсный сайт может просто получить доступ к этой записи статуса и проверить пользователя, он работает. Это, как другие заявили, не должно быть сделано в javascript и является причиной ваших проблем. Вы можете легко опрашивать с помощью Ajax каждые 30 секунд, чтобы проверять запись и возвращать статус практически в реальном времени. Если требуется реальное время, можно использовать WebSocket, чтобы вернуть статус обратно в веб-клиент.