PHP-MySQL cronjob повторяет цикл отправки почты

В одном из моих веб-приложений я отправляю ежедневные письма пользователям, используя функцию задания cron через AMAZON SES. Cronjob будет запускаться с интервалом в 10 минут. Процесс понравится

$sql-mysql_query("SELECT * FROM users WHERE send_date='2013-07-13' and alert_send=0");
while($row=mysql_fetch_array($sql)) {

       // Get email id of the user and compose meggage
       // Create a new Amazon Request and send the mail
       // Update alert_send=1

}

Если цикл содержит больше счетчиков, т. е. предположим, что 500 писем, в следующие 10 минут запустится другое задание cron и начнется отправка писем. В конечном итоге пользователи получат почту дважды или трижды соответственно.

т.е. Если цикл содержит 500 данных

Cron A запустится в 12:00, соберет все 500 данных и отправит электронные письма. Предположим, отправить 120 писем за 10 минут.

Cron B запустится в 12:10 и будет получать данные от 120 до 500. Это также будет отправлять почту.

По этому результату 121-й пользователь получит почту от Cron A и Cron B.

Я попытался ограничить количество запросов. Но проблема в том, что мы не можем предсказать, когда закончится каждый цикл. т.е. иногда для отправки почты требуется 4,2,5,6 или 10 секунд.

Есть ли способ избежать этого дублирования? Есть ли способ убить существующий cronjob и начать новый?

заранее спасибо


person ramesh    schedule 18.07.2013    source источник
comment
вы можете обновить столбец записи alert_send до 1 с 0 после отправки электронной почты на эту запись. Таким образом, 2-й cronjob не получит эту запись.   -  person Raman Bhasker    schedule 18.07.2013
comment
Да, теперь я делаю то, что вы упомянули. Но если первое задание извлекло 300 записей и отправило их, то второе задание также извлечет эти 300 записей, потому что для него не задано значение alert_send=0. Но все же работа A по отправке писем в этот список   -  person ramesh    schedule 18.07.2013


Ответы (1)


Каждый раз, когда запускается cronjob, вы можете убить запущенный cronjob.

вот так по названию:

pkill process-name

или вот так по id:

kill 1234

Также вы можете взглянуть на этот блог, который использует php-код:

http://abhinavsingh.com/blog/2009/12/how-to-use-locks-in-php-cron-jobs-to-avoid-cron-overlaps/

person Perry    schedule 18.07.2013