【问题标题】:PHP- MySQL cronjob sending mail loop repeatPHP- MySQL cronjob 发送邮件循环重复
【发布时间】:2013-07-17 01:34:06
【问题描述】:

在我的一个 Web 应用程序中,我通过 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 作业将开始并开始发送邮件。最终用户将相应地收到两次或三次邮件。

即。如果循环包含 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 并开始新的?

提前致谢

【问题讨论】:

  • 一旦电子邮件发送到此记录,您可以将记录列 alert_send 从 0 更新为 1。这样第二个 cronjob 将不会获取此记录。
  • 是的,现在我正在按照你提到的那样做。但是如果第一个作业获取 300 条记录并发送,第二个作业也获取这 300 条记录,因为它没有设置为 alert_send=0。但仍然是工作 A 向该列表发送邮件

标签: php mysql amazon-web-services cron cron-task


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 2018-10-06
    • 2016-05-10
    • 2020-03-25
    • 1970-01-01
    • 2013-10-10
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多