0

私の Web アプリケーションの 1 つで、AMAZON SES 経由で cron ジョブ機能を使用してユーザーに毎日メールを送信しています。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 ジョブが開始され、メールの送信が開始されます。最終的に、ユーザーはそれに応じてメールを 2 回または 3 回受け取ります。

すなわち。ループに 500 個のデータが含まれる場合

Cron A は 12:00 に開始され、500 個のデータすべてを取得してメールを送信します。10 分で 120 通のメールを送信するとします。

Cron B は 12:10 に開始し、120 から 500 までのデータを取得します。これにより、メールも送信されます。

この結果、121 番目のユーザーが Cron A と Cron B からメールを受け取ることになります。

クエリ数を制限しようとしました。しかし問題は、各ループがいつ終了するかを予測できないことです。つまり、メールの送信に 4、2、5、6、または 10 秒かかることがあります。

この重複を避ける方法はありますか? 既存のcronjobを強制終了して新しく開始する方法はありますか?

前もって感謝します

4

1 に答える 1

0

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/

于 2013-07-18T08:18:10.643 に答える