Разбивая цикл на части, задерживая их, нужен совет - PullRequest
0 голосов
/ 27 апреля 2011

Я хотел бы разбить процесс (цикл) на несколько частей, например, если нужно отправить 128 писем:

function subs_emails(){    
    $subscribers = //find subscribers

    if(!empty($subscribers )){
        foreach($subscribers as $i => $subscriber){
            sendEmail($subscriber->id);
            if($i % 15 == 0){ //<-- send email per 15
                sleep(60); //to pause the process for 60 seconds 
            }
        }
        return true;
    }else{
        return false;
    }
}

это будет работать ??или есть какое-нибудь другое решение "лучшего подхода" ??нужен совет пожалуйста

спасибо

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Обычный подход состоит в том, чтобы отправлять только несколько писем за раз и отмечать отправленные на заднем плане (например, с помощью флага базы данных = 1)

Затем вызывать скрипт каждые несколько минут с помощью cronjob

Таким образом, у вас не возникает проблем с тайм-аутами php при отправке писем большому количеству подписчиков

0 голосов
/ 27 апреля 2011

sleep () приведет к остановке скрипта на определенное количество секунд (60 в вашем примере). Это действительно не будет нарушать цикл, а просто задержит его.

Возможное решение - записать, какому подписчику уже было отправлено электронное письмо. Затем вы можете запускать ваш скрипт через cron через регулярные промежутки времени и загружать только небольшое количество тех, кому еще не было отправлено электронное письмо. Например:

  1. Сценарий выполняется каждые 10 минут
  2. Загрузка 15 подписчиков, которые не были помечены как уже уведомленные
  3. Обход всех 15 загруженных подписчиков и отправка каждому по электронной почте
  4. Установите флажок для всех 15, чтобы сообщить, что им было отправлено электронное письмо
  5. Скрипт будет запущен через 10 минут для обработки следующих 15 подписчиков
...