Массовая рассылка: цикл с 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, чтобы вернуть статус обратно в веб-клиент.

Другие вопросы по тегам